void __guard_setup(void) { size_t size; if (__guard != 0UL) return; /* Start with the "terminator canary". */ __guard = 0xFF0A0D00UL; #ifndef __SSP_QUICK_CANARY__ # ifdef __SSP_USE_ERANDOM__ { int mib[3]; /* Random is another depth in Linux, hence an array of 3. */ mib[0] = CTL_KERN; mib[1] = KERN_RANDOM; mib[2] = RANDOM_ERANDOM; size = sizeof(unsigned long); if (__sysctl(mib, 3, &__guard, &size, NULL, 0) != (-1)) if (__guard != 0UL) return; } # endif /* ifdef __SSP_USE_ERANDOM__ */ /* * Attempt to open kernel pseudo random device if one exists before * opening urandom to avoid system entropy depletion. */ { int fd; # ifdef __SSP_USE_ERANDOM__ if ((fd = __libc_open("/dev/erandom", O_RDONLY)) == (-1)) # endif fd = __libc_open("/dev/urandom", O_RDONLY); if (fd != (-1)) { size = __libc_read(fd, (char *) &__guard, sizeof(__guard)); __libc_close(fd); if (size == sizeof(__guard)) return; } } #endif /* ifndef __SSP_QUICK_CANARY__ */ /* Everything failed? Or we are using a weakened model of the * terminator canary */ { struct timeval tv; __gettimeofday(&tv, NULL); __guard ^= tv.tv_usec ^ tv.tv_sec; } }
FILE *fopen_unlocked(const char *path, const char *mode) { int f=0; /* O_RDONLY, O_WRONLY or O_RDWR */ int fd; f=__stdio_parse_mode(mode); if ((fd=__libc_open(path,f,0666))<0) return 0; return __stdio_init_file(fd,1,f); }
int creat(const char *file, mode_t mode) { return __libc_open(file, O_WRONLY | O_CREAT | O_TRUNC, mode); }
void __libc_vsyslog(int priority, const char *format, va_list arg_ptr) { char buffer[BUF_SIZE]; char time_buf[20]; int buflen, headerlen; time_t now; struct tm now_tm; pid_t pid; int fd; int sigpipe; struct sigaction action, oldaction; int saved_errno = errno; /* check for invalid priority/facility bits */ if (priority & ~(LOG_PRIMASK|LOG_FACMASK)) { syslog(LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID, "syslog: unknown facility/priorityority: %x", priority); priority &= LOG_PRIMASK|LOG_FACMASK; } /* check priority against setlogmask */ if ((LOG_MASK(LOG_PRI(priority)) && LogMask) == 0) return; /* Set default facility if none specified. */ if ((priority & LOG_FACMASK) == 0) priority |= LogFacility; pid = getpid(); time(&now); strftime(time_buf, 20, "%h %e %T", localtime_r (&now, &now_tm)); if (LogStat & LOG_PID) headerlen = snprintf(buffer, 130, "<%d>%s %s[%ld]: ", priority, time_buf, LogTag, (long) pid); else headerlen = snprintf(buffer, 130, "<%d>%s %s: ", priority, time_buf, LogTag); if (!LogTag[0]) { if ((LogStat & LOG_PID) != LOG_PID) headerlen = snprintf(buffer, 130, "<%d>%s (unknown)[%ld]: ", priority, time_buf, (long) pid); strcat(buffer+headerlen, "syslog without openlog w/ ident, please check code!"); buflen = 41; } else { errno=saved_errno; buflen = vsnprintf(buffer+headerlen, BUF_SIZE - headerlen, format, arg_ptr); } if (LogStat & LOG_PERROR) { __libc_write(1, buffer+headerlen, buflen); if (buffer[headerlen+buflen] != '\n') __libc_write(1,"\n", 1); } /* prepare for broken connection */ memset(&action, 0, sizeof(action)); action.sa_handler = SIG_IGN; sigemptyset(&action.sa_mask); sigpipe = sigaction (SIGPIPE, &action, &oldaction); if (!connected) openlog_intern(LogStat | LOG_NDELAY, 0); /* If we have a SOCK_STREAM connection, also send ASCII NUL as a * record terminator. */ if (LogType == SOCK_STREAM) buflen++; if (!connected || (send(LogFile, buffer, buflen+headerlen, 0) != buflen+headerlen)) { if (LogType == SOCK_STREAM) buflen--; closelog_intern(); /* * Output the message to the console; don't worry about blocking, * if console blocks everything will. Make sure the error reported * is the one from the syslogd failure. */ if ((LogStat & LOG_CONS) && ((fd = __libc_open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY, 0)) >= 0)) { __libc_write(fd, buffer, buflen+headerlen); __libc_write(fd, "\r\n", 2); __libc_close(fd); } } if (sigpipe == 0) sigaction(SIGPIPE, &oldaction, (struct sigaction *) NULL); }