浏览代码

isofs: fix timestamps beyond 2027

isofs uses a 'char' variable to load the number of years since
1900 for an inode timestamp. On architectures that use a signed
char type by default, this results in an invalid date for
anything beyond 2027.

This changes the function argument to a 'u8' array, which
is defined the same way on all architectures, and unambiguously
lets us use years until 2155.

This should be backported to all kernels that might still be
in use by that date.

Cc: stable@vger.kernel.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jan Kara <jack@suse.cz>
Arnd Bergmann 8 年之前
父节点
当前提交
34be4dbf87
共有 3 个文件被更改,包括 3 次插入3 次删除
  1. 1 1
      fs/isofs/isofs.h
  2. 1 1
      fs/isofs/rock.h
  3. 1 1
      fs/isofs/util.c

+ 1 - 1
fs/isofs/isofs.h

@@ -106,7 +106,7 @@ static inline unsigned int isonum_733(char *p)
 	/* Ignore bigendian datum due to broken mastering programs */
 	/* Ignore bigendian datum due to broken mastering programs */
 	return get_unaligned_le32(p);
 	return get_unaligned_le32(p);
 }
 }
-extern int iso_date(char *, int);
+extern int iso_date(u8 *, int);
 
 
 struct inode;		/* To make gcc happy */
 struct inode;		/* To make gcc happy */
 
 

+ 1 - 1
fs/isofs/rock.h

@@ -65,7 +65,7 @@ struct RR_PL_s {
 };
 };
 
 
 struct stamp {
 struct stamp {
-	char time[7];
+	__u8 time[7];		/* actually 6 unsigned, 1 signed */
 } __attribute__ ((packed));
 } __attribute__ ((packed));
 
 
 struct RR_TF_s {
 struct RR_TF_s {

+ 1 - 1
fs/isofs/util.c

@@ -15,7 +15,7 @@
  * to GMT.  Thus  we should always be correct.
  * to GMT.  Thus  we should always be correct.
  */
  */
 
 
-int iso_date(char * p, int flag)
+int iso_date(u8 *p, int flag)
 {
 {
 	int year, month, day, hour, minute, second, tz;
 	int year, month, day, hour, minute, second, tz;
 	int crtime;
 	int crtime;