From: Luk Claes Date: Tue, 12 Jul 2011 14:38:03 +0000 (-0400) Subject: mount.nfs: Do not segfault because of kernel version X-Git-Tag: nfs-utils-1-2-5-rc1~6 X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=commitdiff_plain;h=0062bea7159b3c7516d4d361ef1244d727231936 mount.nfs: Do not segfault because of kernel version mount.nfs segfaults if kernel version number does not contain at least 3 components delimited with a dot. Avoid this by matching up to three unsigned integers inialised to zero, separated by dots. A version that does not start with an integer is probably a future version where the versioning evolved to another scheme. Return UINT_MAX which is guaranteed to be higher than existing versions. This would also make it possible to easily identify versions that do not start with an integer. Signed-off-by: Luk Claes Signed-off-by: Steve Dickson --- diff --git a/utils/mount/version.h b/utils/mount/version.h index af61a6f..531cf68 100644 --- a/utils/mount/version.h +++ b/utils/mount/version.h @@ -23,8 +23,8 @@ #ifndef _NFS_UTILS_MOUNT_VERSION_H #define _NFS_UTILS_MOUNT_VERSION_H -#include -#include +#include +#include #include @@ -37,14 +37,16 @@ static inline unsigned int MAKE_VERSION(unsigned int p, unsigned int q, static inline unsigned int linux_version_code(void) { struct utsname my_utsname; - unsigned int p, q, r; + unsigned int p, q = 0, r = 0; + /* UINT_MAX as backward compatibility code should not be run */ if (uname(&my_utsname)) - return 0; + return UINT_MAX; - p = (unsigned int)atoi(strtok(my_utsname.release, ".")); - q = (unsigned int)atoi(strtok(NULL, ".")); - r = (unsigned int)atoi(strtok(NULL, ".")); + /* UINT_MAX as future versions might not start with an integer */ + if (sscanf(my_utsname.release, "%u.%u.%u", &p, &q, &r) < 1) + return UINT_MAX; + return MAKE_VERSION(p, q, r); }