lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1400625070-61813-1-git-send-email-adilger@dilger.ca>
Date:	Tue, 20 May 2014 16:31:10 -0600
From:	Andreas Dilger <adilger@...ger.ca>
To:	tytso@....edu
Cc:	linux-ext4@...r.kernel.org, Andreas Dilger <adilger@...ger.ca>
Subject: [PATCH] debugfs: fix string_to_time for MacOS strptime()

The strptime() function does not update fields in struct tm that are
not specified in the input format.  The glibc implementation sets the
tm_yday field (%j) when any of the year (%Y), month (%m), or day (%d)
fields are changed, but the MacOS strptime() does not set tm_yday in
this case.  This caused string_to_time() to calculate the wrong Unix
epoch on MacOS. If tm_yday is unset, compute it in string_to_time().

Signed-off-by: Andreas Dilger <adilger@...ger.ca>
---
 debugfs/util.c                    | 14 ++++++++++++++
 tests/f_dup_resize/script         |  2 +-
 tests/f_uninit_last_uninit/script |  2 +-
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/debugfs/util.c b/debugfs/util.c
index 9ddfe0b..20c6c61 100644
--- a/debugfs/util.c
+++ b/debugfs/util.c
@@ -245,6 +245,20 @@ time_t string_to_time(const char *arg)
 		ts.tm_mday = 0;
 #endif
 	ts.tm_isdst = -1;
+	/* strptime() may only update the specified fields, which does not
+	 * necessarily include ts.tm_yday (%j).  Calculate this if unset:
+	 *
+	 * Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
+	 * 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
+	 *
+	 * Start with 31 days per month.  Even months have only 30 days, but
+	 * reverse in August, subtract one day for those months. February has
+	 * only 28 days, not 30, subtract two days. Add day of month, minus
+	 * one, since day is not finished yet.  Leap years handled afterward. */
+	if (ts.tm_yday == 0)
+		ts.tm_yday = (ts.tm_mon * 31) -
+			((ts.tm_mon - (ts.tm_mon > 7)) / 2) -
+			2 * (ts.tm_mon > 1) + ts.tm_mday - 1;
 	ret = ts.tm_sec + ts.tm_min*60 + ts.tm_hour*3600 + ts.tm_yday*86400 +
 		(ts.tm_year-70)*31536000 + ((ts.tm_year-69)/4)*86400 -
 		((ts.tm_year-1)/100)*86400 + ((ts.tm_year+299)/400)*86400;
diff --git a/tests/f_dup_resize/script b/tests/f_dup_resize/script
index 659c92e..19fa120 100644
--- a/tests/f_dup_resize/script
+++ b/tests/f_dup_resize/script
@@ -12,7 +12,7 @@ freeb 4 4
 freeb 8195 4
 write $TEST_DATA debugfs
 set_current_time 20050411000000
-set_inode_field debugfs mtime 2005041100000000
+set_inode_field debugfs mtime 20050411000000
 q
 EOF
 
diff --git a/tests/f_uninit_last_uninit/script b/tests/f_uninit_last_uninit/script
index 2fe4f3a..376c978 100644
--- a/tests/f_uninit_last_uninit/script
+++ b/tests/f_uninit_last_uninit/script
@@ -5,7 +5,7 @@ SKIP_GUNZIP="true"
 touch $TMPFILE
 $MKE2FS -N 32 -F -o Linux -O uninit_bg -b 1024 $TMPFILE 10000 > /dev/null 2>&1 
 $DEBUGFS -w $TMPFILE << EOF > /dev/null 2>&1
-set_current_time 200704102100
+set_current_time 20070410210000
 set_super_value lastcheck 0
 set_super_value hash_seed null
 set_super_value mkfs_time 0
-- 
1.9.3

--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists