Patch: cromwell/fs/cdrom

Ge van Geldorp <[email protected]>
Newsgroups gmane.linux.ports.xbox.devel
Message-ID <[email protected]>
Hello,

I'm new to the Xbox part of the woods, so if I do something stupid please let
me know :-). Maybe a short introduction: I'm one of the developers of ReactOS
(http://www.reactos.com). After meeting Michael on LinuxWorldExpo in Frankfurt,
we decided porting ReactOS to the Xbox would be a nice project.
While working on loading our startup code from CD, I noticed some things in
the Cromwell ISO9600 fs code that don't seem correct. Hence the following
patch.

Changelog:
 - Don't overwrite the byte following the directory entry with NUL, that
   byte might actually be the length byte of the next directory entry
 - When the length byte of a directory entry is 0, skip to the next sector
 - Don't recurse into a directory unless we need to

Index: fs/cdrom/iso9660.c
===================================================================
RCS file: /cvsroot/xbox-linux/cromwell/fs/cdrom/iso9660.c,v
retrieving revision 1.5
diff -u -r1.5 iso9660.c
--- fs/cdrom/iso9660.c	20 Aug 2004 09:53:59 -0000	1.5
+++ fs/cdrom/iso9660.c	5 Nov 2004 20:06:00 -0000
@@ -29,8 +29,7 @@
 	}
 }
 
-int iso9660_name_translate(char *old) {
-  int len = strlen(old);
+int iso9660_name_translate(char *translated, char *old, unsigned len) {
   int i;
   
   for (i = 0; i < len; i++) {
@@ -53,9 +52,9 @@
     if (c == ';')
       c = '.';
     
-    old[i] = c;
+    translated[i] = c;
   }
-  old[i] = '\0';
+  translated[i] = '\0';
   return i;
 }
 
@@ -89,13 +88,14 @@
 		dir = (struct iso_directory_record *)&buffer[offset];
 		dir_length = *((unsigned char *)(dir->length));
 		if(!dir_length) {
-			offset++;
+			/* Skip to next sector */
+			offset = (offset + ISOFS_BLOCK_SIZE) & ~ (ISOFS_BLOCK_SIZE - 1);
 			continue;
 		}
 		if(dir->name[0] != 0 && dir->name[0] != 1) {
-			dir->name[(unsigned char)dir->name_len[0]] = 0;
-			iso9660_name_translate(dir->name);
-			sprintf(newfilename,"%s/%s",filename, dir->name);
+			sprintf(newfilename, "%s/", filename);
+			iso9660_name_translate(newfilename + strlen(newfilename),
+				 dir->name, (unsigned char) dir->name_len[0]);
 //			printk("Read : Sector %d Filename %s %d\n", 
 //					*((unsigned long *)(dir->extent)),  newfilename,
 //					(unsigned char)dir->ext_attr_length[0]);
@@ -114,15 +114,13 @@
 			}
 		}
 		if((*((char *)(dir->flags)) & IS_DIR) && (*((unsigned char *)(dir->name_len)) > 1)) {
-			if((strlen(newfilename) + strlen(dir->name)) > 1024) {
-				free(newfilename);
-				free(buffer);
-				return 0;
-			}
-			sprintf(newfilename,"%s/%s",filename, dir->name);
 //			printk("Directory %s Filename %s\n", newfilename, search);
-			sect = read_dir(driveId, dir, search, newfilename, dir_found);
-			if(sect != 0) return sect;
+			if (strlen(newfilename) < strlen(search) &&
+			    0 == memcmp(search, newfilename, strlen(newfilename)) &&
+			    '/' == search[strlen(newfilename)]) {
+				sect = read_dir(driveId, dir, search, newfilename, dir_found);
+				return sect;
+			}
 		}
 		offset+=dir_length;
 		sect = 0;


-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.