/* Time bounds setting test * by: john stultz (johnstul@us.ibm.com) * (C) Copyright IBM 2012 * Licensed under the GPLv2 * * NOTE: This is a meta-test which sets the time to edge cases then * uses other tests to detect problems. Thus this test requires that * the inconsistency-check and nanosleep tests be present in the same * directory it is run from. * * To build: * $ gcc set-2038.c -o set-2038 -lrt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include #include #include #include #include #ifdef KTEST #include "../kselftest.h" #else static inline int ksft_exit_pass(void) { exit(0); } static inline int ksft_exit_fail(void) { exit(1); } #endif #define NSEC_PER_SEC 1000000000LL #define KTIME_MAX ((long long)~((unsigned long long)1 << 63)) #define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC) #define YEAR_1901 (-0x7fffffffL) #define YEAR_1970 1 #define YEAR_2038 0x7fffffffL /*overflows 32bit time_t */ #define YEAR_2262 KTIME_SEC_MAX /*overflows 64bit ktime_t */ #define YEAR_MAX ((long long)((1ULL<<63)-1)) /*overflows 64bit time_t */ int is32bits(void) { return (sizeof(long) == 4); } int settime(long long time) { struct timeval now; int ret; now.tv_sec = (time_t)time; now.tv_usec = 0; ret = settimeofday(&now, NULL); printf("Setting time to 0x%lx: %d\n", (long)time, ret); return ret; } int do_tests(void) { int ret; ret = system("date"); ret = system("./inconsistency-check -c 0 -t 20"); ret |= system("./nanosleep"); ret |= system("./nsleep-lat"); return ret; } int main(int argc, char *argv[]) { int ret = 0; int opt, dangerous = 0; time_t start; /* Process arguments */ while ((opt = getopt(argc, argv, "d")) != -1) { switch (opt) { case 'd': dangerous = 1; } } start = time(0); /* First test that crazy values don't work */ if (!settime(YEAR_1901)) { ret = -1; goto out; } if (!settime(YEAR_MAX)) { ret = -1; goto out; } if (!is32bits() && !settime(YEAR_2262)) { ret = -1; goto out; } /* Now test behavior near edges */ settime(YEAR_1970); ret = do_tests(); if (ret) goto out; settime(YEAR_2038 - 600); ret = do_tests(); if (ret) goto out; /* The rest of the tests can blowup on 32bit systems */ if (is32bits() && !dangerous) goto out; /* Test rollover behavior 32bit edge */ settime(YEAR_2038 - 10); ret = do_tests(); if (ret) goto out; settime(YEAR_2262 - 600); ret = do_tests(); out: /* restore clock */ settime(start); if (ret) return ksft_exit_fail(); return ksft_exit_pass(); } AgeCommit message (Collapse)AuthorFilesLines 2017-02-10Merge tag 'mac80211-next-for-davem-2017-02-09' of ↵David S. Miller14-178/+105 git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next Johannes Berg says: ==================== Some more updates: * use shash in mac80211 crypto code where applicable * some documentation fixes * pass RSSI levels up in change notifications * remove unused rfkill-regulator * various other cleanups ==================== Signed-off-by: David S. Miller <davem@davemloft.net> 2017-02-09mac80211: fix CSA in IBSS modeKoen Vandeputte1-2/+2 Add the missing IBSS capability flag during capability init as it needs to be inserted into the generated beacon in order for CSA to work. Fixes: cd7760e62c2ac ("mac80211: add support for CSA in IBSS mode") Signed-off-by: Piotr Gawlowicz <gawlowicz@tkn.tu-berlin.de> Signed-off-by: Mikołaj Chwalisz <chwalisz@tkn.tu-berlin.de> Tested-by: Koen Vandeputte <koen.vandeputte@ncentric.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> 2017-02-09cfg80211: fix NAN bands definitionLuca Coelho2-10/+10 The nl80211_nan_dual_band_conf enumeration doesn't make much sense. The default value is assigned to a bit, which makes it weird if the default bit and other bits are set at the same time. To improve this, get rid of NL80211_NAN_BAND_DEFAULT and add a wiphy configuration to let the drivers define which bands are supported. This is exposed to the userspace, which then can make a decision on which band(s) to use. Additionally, rename all "dual_band" elements to "bands", to make things clearer. Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> 2017-02-08cfg80211: Pass new RSSI level in CQM RSSI notificationAndrzej Zaborowski1-1/+1 Update the drivers to pass the RSSI level as a cfg80211_cqm_rssi_notify parameter and pass this value to userspace in a new nl80211 attribute. This helps both userspace and also helps in the implementation of the multiple RSSI thresholds CQM mechanism. Note for marvell/mwifiex I pass 0 for the RSSI value because the new RSSI value is not available to the driver at the time of the cfg80211_cqm_rssi_notify call, but the driver queries the new value immediately after that, so it is actually available just a moment later if we wanted to defer caling cfg80211_cqm_rssi_notify until that moment. Without this, the new cfg80211 code (patch 3) will call .get_station which will send a duplicate HostCmd_CMD_RSSI_INFO command to the hardware. Signed-off-by: Andrew Zaborowski <andrew.zaborowski@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> 2017-02-08mac80211: Pass new RSSI level in CQM RSSI notificationAndrzej Zaborowski2-7/+11 Extend ieee80211_cqm_rssi_notify with a rssi_level parameter so that this information can be passed to netlink clients in the next patch, if available. Most drivers will have this value at hand. wl1251 receives events from the firmware that only tell it whether latest measurement is above or below threshold so we don't pass any value at this time (parameter is 0). Signed-off-by: Andrew Zaborowski <andrew.zaborowski@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> 2017-02-08mac80211: check for allocation failure in debugfs codeDan Carpenter1-2/+9 kmalloc() can fail. Also let's move the allocation out of the declaration block so it's easier to read. Fixes: 4a5eccaa9350 ("mac80211: Show pending txqlen in debugfs.") Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> 2017-02-08mac80211: aes-cmac: switch to shash CMAC driverArd Biesheuvel3-107/+32 Instead of open coding the CMAC algorithm in the mac80211 driver using byte wide xors and calls into the crypto layer for each block of data, instantiate a cmac(aes) synchronous hash and pass all the data into it directly. This does not only simplify the code, it also allows the use of more efficient and more secure implementations, especially on platforms where SIMD ciphers have a considerable setup cost. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Johannes Berg <johannes.berg@intel.com> 2017-02-08mac80211: fils_aead: Use crypto api CMAC shash rather than bare cipherArd Biesheuvel3-45/+34 Switch the FILS AEAD code to use a cmac(aes) shash instantiated by the crypto API rather than reusing the open coded implementation in aes_cmac_vector(). This makes the code more understandable, and allows platforms to implement cmac(aes) in a more secure (*) and efficient way than is typically possible when using the AES cipher directly. So replace the crypto_cipher by a crypto_shash, and update the aes_s2v() routine to call the shash interface directly. * In particular, the generic table based AES implementation is sensitive to known-plaintext timing attacks on the key, to which AES based MAC algorithms are especially vulnerable, given that their plaintext is not usually secret. Time invariant alternatives are available (e.g., based on SIMD algorithms), but may incur a setup cost that is prohibitive when operating on a single block at a time, which is why they don't usually expose the cipher API. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Johannes Berg <johannes.berg@intel.com> 2017-02-07Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/netDavid S. Miller