uaccess.c 958 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /*
  2. * Copyright (C) 2006 Atmark Techno, Inc.
  3. *
  4. * This file is subject to the terms and conditions of the GNU General Public
  5. * License. See the file "COPYING" in the main directory of this archive
  6. * for more details.
  7. */
  8. #include <linux/string.h>
  9. #include <asm/uaccess.h>
  10. #include <asm/bug.h>
  11. long strnlen_user(const char __user *src, long count)
  12. {
  13. return strlen(src) + 1;
  14. }
  15. #define __do_strncpy_from_user(dst, src, count, res) \
  16. do { \
  17. char *tmp; \
  18. strncpy(dst, src, count); \
  19. for (tmp = dst; *tmp && count > 0; tmp++, count--) \
  20. ; \
  21. res = (tmp - dst); \
  22. } while (0)
  23. long __strncpy_from_user(char *dst, const char __user *src, long count)
  24. {
  25. long res;
  26. __do_strncpy_from_user(dst, src, count, res);
  27. return res;
  28. }
  29. long strncpy_from_user(char *dst, const char __user *src, long count)
  30. {
  31. long res = -EFAULT;
  32. if (access_ok(VERIFY_READ, src, 1))
  33. __do_strncpy_from_user(dst, src, count, res);
  34. return res;
  35. }