Skip to contentSkip to conversation

FAT: fix some issues in FAT write support code

PATCH New Anatolij Gustschin 3 participants 3 messages Dec 15, 2011 – Dec 20, 2011 VFAT/FAT/msdos filesystem

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 FAT: fix some issues in FAT write support code

Writing a file to the FAT partition didn't work while a test using a CF card. The test was done on mpc5200 based board (powerpc). There is a number of problems in FAT write code:

Compiler warning:
fat_write.c: In function 'file_fat_write':
fat_write.c:326: warning: 'counter' may be used uninitialized in this function
fat_write.c:326: note: 'counter' was declared here

'l_filename' string is not terminated, so a file name with garbage at the end is used as a file name as shown by debug code.

Return value of set_contents() is not checked properly so actually a file won't be written at all (as checked using 'fatls' after a write attempt with 'fatwrite' command).

do_fat_write() doesn't return the number of written bytes if no error happened. However the return value of this function is used to show the number of written bytes in do_fat_fswrite().

The patch adds some debug code and fixes above mentioned problems and also fixes a typo in error output.

NOTE: after a successful write to the FAT partition (under U-Boot) the partition was checked under Linux using fsck. The partition needed fixing FATs:
-bash-3.2# fsck -a /dev/sda1
fsck 1.39 (29-May-2006)
dosfsck 2.11, 12 Mar 2005, FAT32, LFN
FATs differ but appear to be intact. Using first FAT. Performing changes.

Cc Donggeun Kim <[email protected]>
Cc Aaron Williams <[email protected]>
---
 fs/fat/fat_write.c |   19 ++++++++++++++-----
 1 files changed, 14 insertions(+), 5 deletions(-)
fs/fat/fat_write.c +14 -5
index 4f1772f..3542b0b 100644
@@ -323,7 +323,7 @@ static void
 fill_dir_slot(fsdata *mydata, dir_entry **dentptr, const char *l_name)
 {
 	dir_slot *slotptr = (dir_slot *)get_vfatname_block;
-	__u8 counter, checksum;
+	__u8 counter = 0, checksum;
 	int idx = 0, ret;
 	char s_name[16];
 
@@ -926,6 +926,7 @@ static int do_fat_write(const char *filename, void *buffer,
 	int cursect;
 	int root_cluster, ret = -1, name_len;
 	char l_filename[VFAT_MAXLEN_BYTES];
+	int write_size = size;
 
 	dir_curclust = 0;
 
@@ -985,7 +986,11 @@ static int do_fat_write(const char *filename, void *buffer,
 	dentptr = (dir_entry *) do_fat_read_block;
 
 	name_len = strlen(filename);
+	if (name_len >= VFAT_MAXLEN_BYTES)
+		name_len = VFAT_MAXLEN_BYTES - 1;
+
 	memcpy(l_filename, filename, name_len);
+	l_filename[name_len] = 0; /* terminate the string */
 	downcase(l_filename);
 
 	startsect = mydata->rootdir_sect;
@@ -1012,10 +1017,12 @@ static int do_fat_write(const char *filename, void *buffer,
 		}
 
 		ret = set_contents(mydata, retdent, buffer, size);
-		if (ret) {
+		if (ret < 0) {
 			printf("Error: writing contents\n");
 			goto exit;
 		}
+		write_size = ret;
+		debug("attempt to write 0x%x bytes\n", write_size);
 
 		/* Flush fat buffer */
 		ret = flush_fat_buffer(mydata);
@@ -1029,7 +1036,7 @@ static int do_fat_write(const char *filename, void *buffer,
 			    get_dentfromdir_block,
 			    mydata->clust_size * mydata->sect_size);
 		if (ret) {
-			printf("Error: wrinting directory entry\n");
+			printf("Error: writing directory entry\n");
 			goto exit;
 		}
 	} else {
@@ -1056,10 +1063,12 @@ static int do_fat_write(const char *filename, void *buffer,
 			start_cluster, size, 0x20);
 
 		ret = set_contents(mydata, empty_dentptr, buffer, size);
-		if (ret) {
+		if (ret < 0) {
 			printf("Error: writing contents\n");
 			goto exit;
 		}
+		write_size = ret;
+		debug("attempt to write 0x%x bytes\n", write_size);
 
 		/* Flush fat buffer */
 		ret = flush_fat_buffer(mydata);
@@ -1080,7 +1089,7 @@ static int do_fat_write(const char *filename, void *buffer,
 
 exit:
 	free(mydata->fatbuf);
-	return ret;
+	return ret < 0 ? ret : write_size;
 }
 
 int file_fat_write(const char *filename, void *buffer, unsigned long maxsize)
Signature · 1 line
1.7.1
#1 lore raw

PATCH 1/1 FAT: fix some issues in FAT write support code

Quoted 37 lines · Anatolij Gustschin

Writing a file to the FAT partition didn't work while a test using a CF card. The test was done on mpc5200 based board (powerpc). There is a number of problems in FAT write code:

Compiler warning:
fat_write.c: In function 'file_fat_write':
fat_write.c:326: warning: 'counter' may be used uninitialized in this function
fat_write.c:326: note: 'counter' was declared here

'l_filename' string is not terminated, so a file name with garbage at the end is used as a file name as shown by debug code.

Return value of set_contents() is not checked properly so actually a file won't be written at all (as checked using 'fatls' after a write attempt with 'fatwrite' command).

do_fat_write() doesn't return the number of written bytes if no error happened. However the return value of this function is used to show the number of written bytes in do_fat_fswrite().

The patch adds some debug code and fixes above mentioned problems and also fixes a typo in error output.

NOTE: after a successful write to the FAT partition (under U-Boot) the partition was checked under Linux using fsck. The partition needed fixing FATs:
-bash-3.2# fsck -a /dev/sda1
fsck 1.39 (29-May-2006)
dosfsck 2.11, 12 Mar 2005, FAT32, LFN
FATs differ but appear to be intact. Using first FAT. Performing changes.

Quoted 3 lines
Cc Donggeun Kim <[email protected]>
Cc Aaron Williams <[email protected]>

Thanks.
-Donggeun

#2 lore raw

PATCH 1/1 FAT: fix some issues in FAT write support code

In reply to Anatolij Gustschin

Dear Anatolij Gustschin,

Quoted 37 lines · In message <[email protected]> you wrote:

Writing a file to the FAT partition didn't work while a test using a CF card. The test was done on mpc5200 based board (powerpc). There is a number of problems in FAT write code:

Compiler warning:
fat_write.c: In function 'file_fat_write':
fat_write.c:326: warning: 'counter' may be used uninitialized in this function
fat_write.c:326: note: 'counter' was declared here

'l_filename' string is not terminated, so a file name with garbage at the end is used as a file name as shown by debug code.

Return value of set_contents() is not checked properly so actually a file won't be written at all (as checked using 'fatls' after a write attempt with 'fatwrite' command).

do_fat_write() doesn't return the number of written bytes if no error happened. However the return value of this function is used to show the number of written bytes in do_fat_fswrite().

The patch adds some debug code and fixes above mentioned problems and also fixes a typo in error output.

NOTE: after a successful write to the FAT partition (under U-Boot) the partition was checked under Linux using fsck. The partition needed fixing FATs:
-bash-3.2# fsck -a /dev/sda1
fsck 1.39 (29-May-2006)
dosfsck 2.11, 12 Mar 2005, FAT32, LFN
FATs differ but appear to be intact. Using first FAT. Performing changes.

Quoted 6 lines
Cc Donggeun Kim <[email protected]>
Cc Aaron Williams <[email protected]>
---
 fs/fat/fat_write.c |   19 ++++++++++++++-----
 1 files changed, 14 insertions(+), 5 deletions(-)

Applied, thanks.

Best regards,

Wolfgang Denk

Signature · 5 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Emotions are alien to me.  I'm a scientist.
	-- Spock, "This Side of Paradise", stardate 3417.3