/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 only, * as published by the Free Software Foundation. * 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 version 2 for more details. A copy is * included in the COPYING file that accompanied this code. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * GPL HEADER END * * Copyright (c) 2013, Intel Corporation. * * lustre/tests/listxattr_size_check.c * * Author: Keith Mannthey */ #include #include #include #include #include #include void usage(char *prog) { printf("Usage: %s \n", prog); } /* Test the listxattr return value when the buffer is small. */ int main(int argc, char *argv[]) { char *path, *buf; ssize_t ret_buf, ret_null, error_s; int ret = 0; if (argc != 2) { usage(argv[0]); exit(1); } path = argv[1]; ret_null = listxattr(path, NULL, 0); if (ret_null < 0) { fprintf(stderr, "listxattr(%s, NULL, 0) failed " "with %i: %s\n", path, errno, strerror(errno)); ret = errno; goto out; } /* LU-3403 llite: error of listxattr when buffer is small */ if (ret_null < 2) { fprintf(stderr, "listxattr(%s, NULL, 0) returned" "a sizes less than 2", path); ret = EINVAL; goto out; } error_s = ret_null - 1; buf = (char *)malloc(error_s); if (buf == NULL) { fprintf(stderr, "malloc(%zi) failed with %i: %s\n", error_s, errno, strerror(errno)); ret = errno; goto out; } ret_buf = llistxattr(path, buf, error_s); if (ret_buf != -1) { fprintf(stderr, "llistxattr(%s, %p, %zi) passed with %zi but " "should have failed with -1\n", path, buf, error_s, ret_buf); ret = EINVAL; goto free; } free: free(buf); out: return ret; }