Package: atftp
Version: 0.7.dfsg-9.2
Severity: normal
Tags: patch upstream

To reproduce the problem:
 1. create a small ramdisk
 2. almost fill the ramdisk (leave some free bytes)
 3. transfer a file bigger than the available space can fit

atftp -g -r somefile someserver
echo $?
0

Despite exiting cleanly as seen above, strace shows that write() is complaining:

write(4, 
"]\260\333\0\257\300\377'\334S\374\204p\303&\...@h\23\0h\350\23\0`\350\23\0p5\0\0\320"...,
 190) = -1 ENOSPC (No space left on device)

the attached patch fixes the problem.
Regards,
Davide
diff --git a/tftp_file.c b/tftp_file.c
index 579d4ec..2955e69 100644
--- a/tftp_file.c
+++ b/tftp_file.c
@@ -532,7 +532,7 @@ int tftp_receive_file(struct client_data *data)
                             data->local_file);
                     tftp_send_error(sockfd, &sa, ENOSPACE, data->data_buffer,
                                     data->data_buffer_size);
-                    state = S_END;
+                    state = S_ABORT;
                     break;
                }
                data->file_size += data_size;
diff --git a/tftp_io.c b/tftp_io.c
index c6beb40..7b987b4 100644
--- a/tftp_io.c
+++ b/tftp_io.c
@@ -430,8 +430,10 @@ int tftp_file_write(FILE *fp, char *data_buffer, int data_buffer_size, int block
      if (!convert)
      {
 	  /* Simple case, just seek and write */
-          fseek(fp, (block_number - 1) * data_buffer_size, SEEK_SET);
-          data_size = fwrite(data_buffer, 1, data_size, fp);
+          if (fseek(fp, (block_number - 1) * data_buffer_size, SEEK_SET) == 0)
+               data_size = fwrite(data_buffer, 1, data_size, fp);
+          else
+               data_size = 0;
           return data_size;
      }
      else

Attachment: signature.asc
Description: Digital signature

Reply via email to