On Mon, Jun 09, 2014 at 09:16:42PM +0200, Tobias Stoeckmann wrote:
> + cl++;
[...]
> + *p |= (u_char)(fat[cl + 1].next << 4);
> + *p++ = (u_char)(fat[cl + 1].next >> 4);
And here the correct diff, cl + 1 must not be done after cl++ ...
Index: fat.c
===================================================================
RCS file: /cvs/src/sbin/fsck_msdos/fat.c,v
retrieving revision 1.19
diff -u -p -r1.19 fat.c
--- fat.c 9 Jun 2014 09:13:33 -0000 1.19
+++ fat.c 9 Jun 2014 19:06:26 -0000
@@ -471,13 +471,15 @@ writefat(int fs, struct bootblock *boot,
default:
if (fat[cl].next == CLUST_FREE)
boot->NumFree++;
- if (cl + 1 < boot->NumClusters
- && fat[cl + 1].next == CLUST_FREE)
- boot->NumFree++;
*p++ = (u_char)fat[cl].next;
- *p++ = (u_char)((fat[cl].next >> 8) & 0xf)
- |(u_char)(fat[cl+1].next << 4);
- *p++ = (u_char)(fat[++cl].next >> 4);
+ *p++ = (u_char)((fat[cl].next >> 8) & 0xf);
+ cl++;
+ if (cl >= boot->NumClusters)
+ break;
+ if (fat[cl].next == CLUST_FREE)
+ boot->NumFree++;
+ *p |= (u_char)(fat[cl].next << 4);
+ *p++ = (u_char)(fat[cl].next >> 4);
break;
}
}