(linenum→info "unix/slp.c:2238")

glibc/2.7/debug/stpncpy_chk.c

    1: /* Copyright (C) 1993,1995,1996,1997,2002,2005 Free Software Foundation, Inc.
    2:    This file is part of the GNU C Library.
    3: 
    4:    The GNU C Library is free software; you can redistribute it and/or
    5:    modify it under the terms of the GNU Lesser General Public
    6:    License as published by the Free Software Foundation; either
    7:    version 2.1 of the License, or (at your option) any later version.
    8: 
    9:    The GNU C Library is distributed in the hope that it will be useful,
   10:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   11:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   12:    Lesser General Public License for more details.
   13: 
   14:    You should have received a copy of the GNU Lesser General Public
   15:    License along with the GNU C Library; if not, write to the Free
   16:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   17:    02111-1307 USA.  */
   18: 
   19: /* This is almost copied from strncpy.c, written by Torbjorn Granlund.  */
   20: 
   21: #include <string.h>
   22: 
   23: 
   24: /* Copy no more than N characters of SRC to DEST, returning the address of
   25:    the terminating '\0' in DEST, if any, or else DEST + N.  */
   26: char *
   27: __stpncpy_chk (char *dest, const char *src, size_t n, size_t destlen)
   28: {
   29:   char c;
   30:   char *s = dest;
   31: 
   32:   if (__builtin_expect (destlen < n, 0))
   33:     __chk_fail ();
   34: 
   35:   if (n >= 4)
   36:     {
   37:       size_t n4 = n >> 2;
   38: 
   39:       for (;;)
   40:         {
   41:           c = *src++;
   42:           *dest++ = c;
   43:           if (c == '\0')
   44:             break;
   45:           c = *src++;
   46:           *dest++ = c;
   47:           if (c == '\0')
   48:             break;
   49:           c = *src++;
   50:           *dest++ = c;
   51:           if (c == '\0')
   52:             break;
   53:           c = *src++;
   54:           *dest++ = c;
   55:           if (c == '\0')
   56:             break;
   57:           if (--n4 == 0)
   58:             goto last_chars;
   59:         }
   60:       n -= dest - s;
   61:       goto zero_fill;
   62:     }
   63: 
   64:  last_chars:
   65:   n &= 3;
   66:   if (n == 0)
   67:     return dest;
   68: 
   69:   for (;;)
   70:     {
   71:       c = *src++;
   72:       --n;
   73:       *dest++ = c;
   74:       if (c == '\0')
   75:         break;
   76:       if (n == 0)
   77:         return dest;
   78:     }
   79: 
   80:  zero_fill:
   81:   while (n-- > 0)
   82:     dest[n] = '\0';
   83: 
   84:   return dest - 1;
   85: }
Syntax (Markdown)