139bac055674d23770b9a724221b728e443196ea7Elliott Hughes/* 239bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Check decoding of utimes/osf_utimes syscall. 339bac055674d23770b9a724221b728e443196ea7Elliott Hughes * 439bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2015-2017 Dmitry V. Levin <ldv@altlinux.org> 539bac055674d23770b9a724221b728e443196ea7Elliott Hughes * All rights reserved. 639bac055674d23770b9a724221b728e443196ea7Elliott Hughes * 739bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Redistribution and use in source and binary forms, with or without 839bac055674d23770b9a724221b728e443196ea7Elliott Hughes * modification, are permitted provided that the following conditions 939bac055674d23770b9a724221b728e443196ea7Elliott Hughes * are met: 1039bac055674d23770b9a724221b728e443196ea7Elliott Hughes * 1. Redistributions of source code must retain the above copyright 1139bac055674d23770b9a724221b728e443196ea7Elliott Hughes * notice, this list of conditions and the following disclaimer. 1239bac055674d23770b9a724221b728e443196ea7Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 1339bac055674d23770b9a724221b728e443196ea7Elliott Hughes * notice, this list of conditions and the following disclaimer in the 1439bac055674d23770b9a724221b728e443196ea7Elliott Hughes * documentation and/or other materials provided with the distribution. 1539bac055674d23770b9a724221b728e443196ea7Elliott Hughes * 3. The name of the author may not be used to endorse or promote products 1639bac055674d23770b9a724221b728e443196ea7Elliott Hughes * derived from this software without specific prior written permission. 1739bac055674d23770b9a724221b728e443196ea7Elliott Hughes * 1839bac055674d23770b9a724221b728e443196ea7Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1939bac055674d23770b9a724221b728e443196ea7Elliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2039bac055674d23770b9a724221b728e443196ea7Elliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2139bac055674d23770b9a724221b728e443196ea7Elliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2239bac055674d23770b9a724221b728e443196ea7Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2339bac055674d23770b9a724221b728e443196ea7Elliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2439bac055674d23770b9a724221b728e443196ea7Elliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2539bac055674d23770b9a724221b728e443196ea7Elliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2639bac055674d23770b9a724221b728e443196ea7Elliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2739bac055674d23770b9a724221b728e443196ea7Elliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2839bac055674d23770b9a724221b728e443196ea7Elliott Hughes */ 2939bac055674d23770b9a724221b728e443196ea7Elliott Hughes 3039bac055674d23770b9a724221b728e443196ea7Elliott Hughes#ifndef TEST_SYSCALL_NR 3139bac055674d23770b9a724221b728e443196ea7Elliott Hughes# error TEST_SYSCALL_NR must be defined 3239bac055674d23770b9a724221b728e443196ea7Elliott Hughes#endif 3339bac055674d23770b9a724221b728e443196ea7Elliott Hughes 3439bac055674d23770b9a724221b728e443196ea7Elliott Hughes#ifndef TEST_SYSCALL_STR 3539bac055674d23770b9a724221b728e443196ea7Elliott Hughes# error TEST_SYSCALL_STR must be defined 3639bac055674d23770b9a724221b728e443196ea7Elliott Hughes#endif 3739bac055674d23770b9a724221b728e443196ea7Elliott Hughes 3839bac055674d23770b9a724221b728e443196ea7Elliott Hughes#ifndef TEST_STRUCT 3939bac055674d23770b9a724221b728e443196ea7Elliott Hughes# error TEST_STRUCT must be defined 4039bac055674d23770b9a724221b728e443196ea7Elliott Hughes#endif 4139bac055674d23770b9a724221b728e443196ea7Elliott Hughes 4239bac055674d23770b9a724221b728e443196ea7Elliott Hughes#include <stdint.h> 4339bac055674d23770b9a724221b728e443196ea7Elliott Hughes#include <stdio.h> 4439bac055674d23770b9a724221b728e443196ea7Elliott Hughes#include <sys/time.h> 4539bac055674d23770b9a724221b728e443196ea7Elliott Hughes#include <unistd.h> 4639bac055674d23770b9a724221b728e443196ea7Elliott Hughes 4739bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic void 4839bac055674d23770b9a724221b728e443196ea7Elliott Hughesprint_tv(const TEST_STRUCT *const tv) 4939bac055674d23770b9a724221b728e443196ea7Elliott Hughes{ 5039bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("{tv_sec=%lld, tv_usec=%llu}", 5139bac055674d23770b9a724221b728e443196ea7Elliott Hughes (long long) tv->tv_sec, 5239bac055674d23770b9a724221b728e443196ea7Elliott Hughes zero_extend_signed_to_ull(tv->tv_usec)); 5339bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_time_t_usec(tv->tv_sec, 5439bac055674d23770b9a724221b728e443196ea7Elliott Hughes zero_extend_signed_to_ull(tv->tv_usec), 1); 5539bac055674d23770b9a724221b728e443196ea7Elliott Hughes} 5639bac055674d23770b9a724221b728e443196ea7Elliott Hughes 5739bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic const char *errstr; 5839bac055674d23770b9a724221b728e443196ea7Elliott Hughes 5939bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic long 6039bac055674d23770b9a724221b728e443196ea7Elliott Hughesk_utimes(const kernel_ulong_t pathname, const kernel_ulong_t times) 6139bac055674d23770b9a724221b728e443196ea7Elliott Hughes{ 6239bac055674d23770b9a724221b728e443196ea7Elliott Hughes long rc = syscall(TEST_SYSCALL_NR, pathname, times); 6339bac055674d23770b9a724221b728e443196ea7Elliott Hughes errstr = sprintrc(rc); 6439bac055674d23770b9a724221b728e443196ea7Elliott Hughes return rc; 6539bac055674d23770b9a724221b728e443196ea7Elliott Hughes} 6639bac055674d23770b9a724221b728e443196ea7Elliott Hughes 6739bac055674d23770b9a724221b728e443196ea7Elliott Hughesint 6839bac055674d23770b9a724221b728e443196ea7Elliott Hughesmain(void) 6939bac055674d23770b9a724221b728e443196ea7Elliott Hughes{ 7039bac055674d23770b9a724221b728e443196ea7Elliott Hughes static const char proto_fname[] = TEST_SYSCALL_STR "_sample"; 7139bac055674d23770b9a724221b728e443196ea7Elliott Hughes static const char qname[] = "\"" TEST_SYSCALL_STR "_sample\""; 7239bac055674d23770b9a724221b728e443196ea7Elliott Hughes 7339bac055674d23770b9a724221b728e443196ea7Elliott Hughes char *const fname = tail_memdup(proto_fname, sizeof(proto_fname)); 7439bac055674d23770b9a724221b728e443196ea7Elliott Hughes const kernel_ulong_t kfname = (uintptr_t) fname; 7539bac055674d23770b9a724221b728e443196ea7Elliott Hughes TEST_STRUCT *const tv = tail_alloc(sizeof(*tv) * 2); 7639bac055674d23770b9a724221b728e443196ea7Elliott Hughes 7739bac055674d23770b9a724221b728e443196ea7Elliott Hughes /* pathname */ 7839bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimes(0, 0); 7939bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("%s(NULL, NULL) = %s\n", TEST_SYSCALL_STR, errstr); 8039bac055674d23770b9a724221b728e443196ea7Elliott Hughes 8139bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimes(kfname + sizeof(proto_fname) - 1, 0); 8239bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("%s(\"\", NULL) = %s\n", TEST_SYSCALL_STR, errstr); 8339bac055674d23770b9a724221b728e443196ea7Elliott Hughes 8439bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimes(kfname, 0); 8539bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("%s(%s, NULL) = %s\n", TEST_SYSCALL_STR, qname, errstr); 8639bac055674d23770b9a724221b728e443196ea7Elliott Hughes 8739bac055674d23770b9a724221b728e443196ea7Elliott Hughes fname[sizeof(proto_fname) - 1] = '+'; 8839bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimes(kfname, 0); 8939bac055674d23770b9a724221b728e443196ea7Elliott Hughes fname[sizeof(proto_fname) - 1] = '\0'; 9039bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("%s(%p, NULL) = %s\n", TEST_SYSCALL_STR, fname, errstr); 9139bac055674d23770b9a724221b728e443196ea7Elliott Hughes 9239bac055674d23770b9a724221b728e443196ea7Elliott Hughes if (F8ILL_KULONG_SUPPORTED) { 9339bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimes(f8ill_ptr_to_kulong(fname), 0); 9439bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("%s(%#jx, NULL) = %s\n", TEST_SYSCALL_STR, 9539bac055674d23770b9a724221b728e443196ea7Elliott Hughes (uintmax_t) f8ill_ptr_to_kulong(fname), errstr); 9639bac055674d23770b9a724221b728e443196ea7Elliott Hughes } 9739bac055674d23770b9a724221b728e443196ea7Elliott Hughes 9839bac055674d23770b9a724221b728e443196ea7Elliott Hughes /* times */ 9939bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimes(kfname, (uintptr_t) (tv + 1)); 10039bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("%s(%s, %p) = %s\n", TEST_SYSCALL_STR, 10139bac055674d23770b9a724221b728e443196ea7Elliott Hughes qname, tv + 1, errstr); 10239bac055674d23770b9a724221b728e443196ea7Elliott Hughes 10339bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimes(kfname, (uintptr_t) (tv + 2)); 10439bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("%s(%s, %p) = %s\n", TEST_SYSCALL_STR, 10539bac055674d23770b9a724221b728e443196ea7Elliott Hughes qname, tv + 2, errstr); 10639bac055674d23770b9a724221b728e443196ea7Elliott Hughes 10739bac055674d23770b9a724221b728e443196ea7Elliott Hughes tv[0].tv_sec = 0xdeadbeefU; 10839bac055674d23770b9a724221b728e443196ea7Elliott Hughes tv[0].tv_usec = 0xfacefeedU; 10939bac055674d23770b9a724221b728e443196ea7Elliott Hughes tv[1].tv_sec = (time_t) 0xcafef00ddeadbeefLL; 11039bac055674d23770b9a724221b728e443196ea7Elliott Hughes tv[1].tv_usec = (long) 0xbadc0dedfacefeedLL; 11139bac055674d23770b9a724221b728e443196ea7Elliott Hughes 11239bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimes(kfname, (uintptr_t) tv); 11339bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("%s(%s, [", TEST_SYSCALL_STR, qname); 11439bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_tv(&tv[0]); 11539bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf(", "); 11639bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_tv(&tv[1]); 11739bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("]) = %s\n", errstr); 11839bac055674d23770b9a724221b728e443196ea7Elliott Hughes 11939bac055674d23770b9a724221b728e443196ea7Elliott Hughes tv[0].tv_sec = 1492358607; 12039bac055674d23770b9a724221b728e443196ea7Elliott Hughes tv[0].tv_usec = 1000000; 12139bac055674d23770b9a724221b728e443196ea7Elliott Hughes tv[1].tv_sec = 1492356078; 12239bac055674d23770b9a724221b728e443196ea7Elliott Hughes tv[1].tv_usec = 1000001; 12339bac055674d23770b9a724221b728e443196ea7Elliott Hughes 12439bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimes(kfname, (uintptr_t) tv); 12539bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("%s(%s, [", TEST_SYSCALL_STR, qname); 12639bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_tv(&tv[0]); 12739bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf(", "); 12839bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_tv(&tv[1]); 12939bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("]) = %s\n", errstr); 13039bac055674d23770b9a724221b728e443196ea7Elliott Hughes 13139bac055674d23770b9a724221b728e443196ea7Elliott Hughes tv[0].tv_usec = 345678; 13239bac055674d23770b9a724221b728e443196ea7Elliott Hughes tv[1].tv_usec = 456789; 13339bac055674d23770b9a724221b728e443196ea7Elliott Hughes 13439bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimes(kfname, (uintptr_t) tv); 13539bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("%s(%s, [", TEST_SYSCALL_STR, qname); 13639bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_tv(&tv[0]); 13739bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf(", "); 13839bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_tv(&tv[1]); 13939bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("]) = %s\n", errstr); 14039bac055674d23770b9a724221b728e443196ea7Elliott Hughes 14139bac055674d23770b9a724221b728e443196ea7Elliott Hughes if (F8ILL_KULONG_SUPPORTED) { 14239bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimes(kfname, f8ill_ptr_to_kulong(tv)); 14339bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("%s(%s, %#jx) = %s\n", TEST_SYSCALL_STR, 14439bac055674d23770b9a724221b728e443196ea7Elliott Hughes qname, (uintmax_t) f8ill_ptr_to_kulong(tv), errstr); 14539bac055674d23770b9a724221b728e443196ea7Elliott Hughes } 14639bac055674d23770b9a724221b728e443196ea7Elliott Hughes 14739bac055674d23770b9a724221b728e443196ea7Elliott Hughes puts("+++ exited with 0 +++"); 14839bac055674d23770b9a724221b728e443196ea7Elliott Hughes return 0; 14939bac055674d23770b9a724221b728e443196ea7Elliott Hughes} 150