Author: ache
Date: Sun May 29 06:46:17 2016
New Revision: 300946
URL: https://svnweb.freebsd.org/changeset/base/300946

Log:
  MFC: r300397
  
  1) POSIX prohibits printing errors to stderr here and require
  returning NULL:
  
  "Upon successful completion, initstate() and setstate() shall return a
  pointer to the previous state array; otherwise, a null pointer shall
  be returned.
  
  Although some implementations of random() have written messages to
  standard error, such implementations do not conform to POSIX.1-2008."
  
  2) Move error detections earlier to prevent state modifying.

Modified:
  stable/10/lib/libc/stdlib/random.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libc/stdlib/random.c
==============================================================================
--- stable/10/lib/libc/stdlib/random.c  Sun May 29 06:29:22 2016        
(r300945)
+++ stable/10/lib/libc/stdlib/random.c  Sun May 29 06:46:17 2016        
(r300946)
@@ -37,7 +37,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/param.h>
 #include <sys/sysctl.h>
 #include <stdint.h>
-#include <stdio.h>
 #include <stdlib.h>
 #include "un-namespace.h"
 
@@ -341,15 +340,12 @@ initstate(unsigned long seed, char *arg_
        char *ostate = (char *)(&state[-1]);
        uint32_t *int_arg_state = (uint32_t *)arg_state;
 
+       if (n < BREAK_0)
+               return (NULL);
        if (rand_type == TYPE_0)
                state[-1] = rand_type;
        else
                state[-1] = MAX_TYPES * (rptr - state) + rand_type;
-       if (n < BREAK_0) {
-               (void)fprintf(stderr,
-                   "random: not enough state (%ld bytes); ignored.\n", n);
-               return (0);
-       }
        if (n < BREAK_1) {
                rand_type = TYPE_0;
                rand_deg = DEG_0;
@@ -408,24 +404,23 @@ setstate(char *arg_state)
        uint32_t rear = new_state[0] / MAX_TYPES;
        char *ostate = (char *)(&state[-1]);
 
-       if (rand_type == TYPE_0)
-               state[-1] = rand_type;
-       else
-               state[-1] = MAX_TYPES * (rptr - state) + rand_type;
        switch(type) {
        case TYPE_0:
        case TYPE_1:
        case TYPE_2:
        case TYPE_3:
        case TYPE_4:
-               rand_type = type;
-               rand_deg = degrees[type];
-               rand_sep = seps[type];
                break;
        default:
-               (void)fprintf(stderr,
-                   "random: state info corrupted; not changed.\n");
+               return (NULL);
        }
+       if (rand_type == TYPE_0)
+               state[-1] = rand_type;
+       else
+               state[-1] = MAX_TYPES * (rptr - state) + rand_type;
+       rand_type = type;
+       rand_deg = degrees[type];
+       rand_sep = seps[type];
        state = new_state + 1;
        if (rand_type != TYPE_0) {
                rptr = &state[rear];
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to