diff options
Diffstat (limited to '')
44 files changed, 9352 insertions, 9338 deletions
diff --git a/src/lib/libcrypto/bio/b_dump.c b/src/lib/libcrypto/bio/b_dump.c index 492ee09275..bea94969a2 100644 --- a/src/lib/libcrypto/bio/b_dump.c +++ b/src/lib/libcrypto/bio/b_dump.c | |||
| @@ -66,122 +66,125 @@ | |||
| 66 | 66 | ||
| 67 | #define TRUNCATE | 67 | #define TRUNCATE |
| 68 | #define DUMP_WIDTH 16 | 68 | #define DUMP_WIDTH 16 |
| 69 | #define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH-((i-(i>6?6:i)+3)/4)) | 69 | #define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH - ((i - (i > 6 ? 6 : i) + 3) / 4)) |
| 70 | 70 | ||
| 71 | int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), | 71 | int |
| 72 | void *u, const char *s, int len) | 72 | BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), |
| 73 | { | 73 | void *u, const char *s, int len) |
| 74 | { | ||
| 74 | return BIO_dump_indent_cb(cb, u, s, len, 0); | 75 | return BIO_dump_indent_cb(cb, u, s, len, 0); |
| 75 | } | 76 | } |
| 76 | 77 | ||
| 77 | int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), | 78 | int |
| 78 | void *u, const char *s, int len, int indent) | 79 | BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), |
| 79 | { | 80 | void *u, const char *s, int len, int indent) |
| 80 | int ret=0; | 81 | { |
| 81 | char buf[288+1],tmp[20],str[128+1]; | 82 | int ret = 0; |
| 82 | int i,j,rows,trc; | 83 | char buf[288 + 1], tmp[20], str[128 + 1]; |
| 84 | int i, j, rows, trc; | ||
| 83 | unsigned char ch; | 85 | unsigned char ch; |
| 84 | int dump_width; | 86 | int dump_width; |
| 85 | 87 | ||
| 86 | trc=0; | 88 | trc = 0; |
| 87 | 89 | ||
| 88 | #ifdef TRUNCATE | 90 | #ifdef TRUNCATE |
| 89 | for(; (len > 0) && ((s[len-1] == ' ') || (s[len-1] == '\0')); len--) | 91 | for (; (len > 0) && ((s[len - 1] == ' ') || (s[len - 1] == '\0')); len--) |
| 90 | trc++; | 92 | trc++; |
| 91 | #endif | 93 | #endif |
| 92 | 94 | ||
| 93 | if (indent < 0) | 95 | if (indent < 0) |
| 94 | indent = 0; | 96 | indent = 0; |
| 95 | if (indent) | 97 | if (indent) { |
| 96 | { | 98 | if (indent > 128) |
| 97 | if (indent > 128) indent=128; | 99 | indent = 128; |
| 98 | memset(str,' ',indent); | 100 | memset(str, ' ', indent); |
| 99 | } | 101 | } |
| 100 | str[indent]='\0'; | 102 | str[indent] = '\0'; |
| 101 | 103 | ||
| 102 | dump_width=DUMP_WIDTH_LESS_INDENT(indent); | 104 | dump_width = DUMP_WIDTH_LESS_INDENT(indent); |
| 103 | rows=(len/dump_width); | 105 | rows = (len / dump_width); |
| 104 | if ((rows*dump_width)<len) | 106 | if ((rows * dump_width) < len) |
| 105 | rows++; | 107 | rows++; |
| 106 | for(i=0;i<rows;i++) | 108 | for (i = 0; i < rows; i++) { |
| 107 | { | 109 | buf[0] = '\0'; /* start with empty string */ |
| 108 | buf[0]='\0'; /* start with empty string */ | 110 | BUF_strlcpy(buf, str, sizeof buf); |
| 109 | BUF_strlcpy(buf,str,sizeof buf); | 111 | (void) snprintf(tmp, sizeof tmp, "%04x - ", i*dump_width); |
| 110 | (void) snprintf(tmp,sizeof tmp,"%04x - ",i*dump_width); | 112 | BUF_strlcat(buf, tmp, sizeof buf); |
| 111 | BUF_strlcat(buf,tmp,sizeof buf); | 113 | for (j = 0; j < dump_width; j++) { |
| 112 | for(j=0;j<dump_width;j++) | 114 | if (((i*dump_width) + j) >= len) { |
| 113 | { | 115 | BUF_strlcat(buf, " ", sizeof buf); |
| 114 | if (((i*dump_width)+j)>=len) | 116 | } else { |
| 115 | { | 117 | ch = ((unsigned char)*(s + i*dump_width + j)) & 0xff; |
| 116 | BUF_strlcat(buf," ",sizeof buf); | 118 | (void) snprintf(tmp, sizeof tmp, "%02x%c", ch, |
| 117 | } | 119 | j == 7 ? '-' : ' '); |
| 118 | else | 120 | BUF_strlcat(buf, tmp, sizeof buf); |
| 119 | { | ||
| 120 | ch=((unsigned char)*(s+i*dump_width+j)) & 0xff; | ||
| 121 | (void) snprintf(tmp,sizeof tmp,"%02x%c",ch, | ||
| 122 | j==7?'-':' '); | ||
| 123 | BUF_strlcat(buf,tmp,sizeof buf); | ||
| 124 | } | ||
| 125 | } | 121 | } |
| 126 | BUF_strlcat(buf," ",sizeof buf); | 122 | } |
| 127 | for(j=0;j<dump_width;j++) | 123 | BUF_strlcat(buf, " ", sizeof buf); |
| 128 | { | 124 | for (j = 0; j < dump_width; j++) { |
| 129 | if (((i*dump_width)+j)>=len) | 125 | if (((i*dump_width) + j) >= len) |
| 130 | break; | 126 | break; |
| 131 | ch=((unsigned char)*(s+i*dump_width+j)) & 0xff; | 127 | ch = ((unsigned char)*(s + i * dump_width + j)) & 0xff; |
| 132 | #ifndef CHARSET_EBCDIC | 128 | #ifndef CHARSET_EBCDIC |
| 133 | (void) snprintf(tmp,sizeof tmp,"%c", | 129 | (void) snprintf(tmp, sizeof tmp, "%c", |
| 134 | ((ch>=' ')&&(ch<='~'))?ch:'.'); | 130 | ((ch >= ' ') && (ch <= '~')) ? ch : '.'); |
| 135 | #else | 131 | #else |
| 136 | (void) snprintf(tmp,sizeof tmp,"%c", | 132 | (void) snprintf(tmp, sizeof tmp, "%c", |
| 137 | ((ch>=os_toascii[' '])&&(ch<=os_toascii['~'])) | 133 | ((ch >= os_toascii[' ']) && (ch <= os_toascii['~'])) |
| 138 | ? os_toebcdic[ch] | 134 | ? os_toebcdic[ch] : '.'); |
| 139 | : '.'); | ||
| 140 | #endif | 135 | #endif |
| 141 | BUF_strlcat(buf,tmp,sizeof buf); | 136 | BUF_strlcat(buf, tmp, sizeof buf); |
| 142 | } | 137 | } |
| 143 | BUF_strlcat(buf,"\n",sizeof buf); | 138 | BUF_strlcat(buf, "\n", sizeof buf); |
| 144 | /* if this is the last call then update the ddt_dump thing so | 139 | /* if this is the last call then update the ddt_dump thing so |
| 145 | * that we will move the selection point in the debug window | 140 | * that we will move the selection point in the debug window |
| 146 | */ | 141 | */ |
| 147 | ret+=cb((void *)buf,strlen(buf),u); | 142 | ret += cb((void *)buf, strlen(buf), u); |
| 148 | } | 143 | } |
| 149 | #ifdef TRUNCATE | 144 | #ifdef TRUNCATE |
| 150 | if (trc > 0) | 145 | if (trc > 0) { |
| 151 | { | 146 | (void) snprintf(buf, sizeof buf, "%s%04x - <SPACES/NULS>\n", |
| 152 | (void) snprintf(buf,sizeof buf,"%s%04x - <SPACES/NULS>\n",str, | 147 | str, len + trc); |
| 153 | len+trc); | 148 | ret += cb((void *)buf, strlen(buf), u); |
| 154 | ret+=cb((void *)buf,strlen(buf),u); | ||
| 155 | } | ||
| 156 | #endif | ||
| 157 | return(ret); | ||
| 158 | } | 149 | } |
| 150 | #endif | ||
| 151 | return (ret); | ||
| 152 | } | ||
| 159 | 153 | ||
| 160 | #ifndef OPENSSL_NO_FP_API | 154 | #ifndef OPENSSL_NO_FP_API |
| 161 | static int write_fp(const void *data, size_t len, void *fp) | 155 | static int |
| 162 | { | 156 | write_fp(const void *data, size_t len, void *fp) |
| 157 | { | ||
| 163 | return UP_fwrite(data, len, 1, fp); | 158 | return UP_fwrite(data, len, 1, fp); |
| 164 | } | 159 | } |
| 165 | int BIO_dump_fp(FILE *fp, const char *s, int len) | 160 | |
| 166 | { | 161 | int |
| 162 | BIO_dump_fp(FILE *fp, const char *s, int len) | ||
| 163 | { | ||
| 167 | return BIO_dump_cb(write_fp, fp, s, len); | 164 | return BIO_dump_cb(write_fp, fp, s, len); |
| 168 | } | 165 | } |
| 169 | int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent) | 166 | |
| 170 | { | 167 | int |
| 168 | BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent) | ||
| 169 | { | ||
| 171 | return BIO_dump_indent_cb(write_fp, fp, s, len, indent); | 170 | return BIO_dump_indent_cb(write_fp, fp, s, len, indent); |
| 172 | } | 171 | } |
| 173 | #endif | 172 | #endif |
| 174 | 173 | ||
| 175 | static int write_bio(const void *data, size_t len, void *bp) | 174 | static int |
| 176 | { | 175 | write_bio(const void *data, size_t len, void *bp) |
| 176 | { | ||
| 177 | return BIO_write((BIO *)bp, (const char *)data, len); | 177 | return BIO_write((BIO *)bp, (const char *)data, len); |
| 178 | } | 178 | } |
| 179 | int BIO_dump(BIO *bp, const char *s, int len) | 179 | |
| 180 | { | 180 | int |
| 181 | BIO_dump(BIO *bp, const char *s, int len) | ||
| 182 | { | ||
| 181 | return BIO_dump_cb(write_bio, bp, s, len); | 183 | return BIO_dump_cb(write_bio, bp, s, len); |
| 182 | } | 184 | } |
| 183 | int BIO_dump_indent(BIO *bp, const char *s, int len, int indent) | ||
| 184 | { | ||
| 185 | return BIO_dump_indent_cb(write_bio, bp, s, len, indent); | ||
| 186 | } | ||
| 187 | 185 | ||
| 186 | int | ||
| 187 | BIO_dump_indent(BIO *bp, const char *s, int len, int indent) | ||
| 188 | { | ||
| 189 | return BIO_dump_indent_cb(write_bio, bp, s, len, indent); | ||
| 190 | } | ||
diff --git a/src/lib/libcrypto/bio/b_print.c b/src/lib/libcrypto/bio/b_print.c index 143a7cfefa..b3b0d45ee6 100644 --- a/src/lib/libcrypto/bio/b_print.c +++ b/src/lib/libcrypto/bio/b_print.c | |||
| @@ -125,16 +125,15 @@ | |||
| 125 | #define LLONG long | 125 | #define LLONG long |
| 126 | #endif | 126 | #endif |
| 127 | 127 | ||
| 128 | static void fmtstr (char **, char **, size_t *, size_t *, | 128 | static void fmtstr(char **, char **, size_t *, size_t *, const char *, |
| 129 | const char *, int, int, int); | 129 | int, int, int); |
| 130 | static void fmtint (char **, char **, size_t *, size_t *, | 130 | static void fmtint(char **, char **, size_t *, size_t *, LLONG, int, |
| 131 | LLONG, int, int, int, int); | 131 | int, int, int); |
| 132 | static void fmtfp (char **, char **, size_t *, size_t *, | 132 | static void fmtfp(char **, char **, size_t *, size_t *, LDOUBLE, |
| 133 | LDOUBLE, int, int, int); | 133 | int, int, int); |
| 134 | static void doapr_outch (char **, char **, size_t *, size_t *, int); | 134 | static void doapr_outch(char **, char **, size_t *, size_t *, int); |
| 135 | static void _dopr(char **sbuffer, char **buffer, | 135 | static void _dopr(char **sbuffer, char **buffer, size_t *maxlen, |
| 136 | size_t *maxlen, size_t *retlen, int *truncated, | 136 | size_t *retlen, int *truncated, const char *format, va_list args); |
| 137 | const char *format, va_list args); | ||
| 138 | 137 | ||
| 139 | /* format read states */ | 138 | /* format read states */ |
| 140 | #define DP_S_DEFAULT 0 | 139 | #define DP_S_DEFAULT 0 |
| @@ -166,607 +165,576 @@ static void _dopr(char **sbuffer, char **buffer, | |||
| 166 | #define OSSL_MAX(p,q) ((p >= q) ? p : q) | 165 | #define OSSL_MAX(p,q) ((p >= q) ? p : q) |
| 167 | 166 | ||
| 168 | static void | 167 | static void |
| 169 | _dopr( | 168 | _dopr(char **sbuffer, char **buffer, size_t *maxlen, size_t *retlen, |
| 170 | char **sbuffer, | 169 | int *truncated, const char *format, va_list args) |
| 171 | char **buffer, | ||
| 172 | size_t *maxlen, | ||
| 173 | size_t *retlen, | ||
| 174 | int *truncated, | ||
| 175 | const char *format, | ||
| 176 | va_list args) | ||
| 177 | { | 170 | { |
| 178 | char ch; | 171 | char ch; |
| 179 | LLONG value; | 172 | LLONG value; |
| 180 | LDOUBLE fvalue; | 173 | LDOUBLE fvalue; |
| 181 | char *strvalue; | 174 | char *strvalue; |
| 182 | int min; | 175 | int min; |
| 183 | int max; | 176 | int max; |
| 184 | int state; | 177 | int state; |
| 185 | int flags; | 178 | int flags; |
| 186 | int cflags; | 179 | int cflags; |
| 187 | size_t currlen; | 180 | size_t currlen; |
| 188 | 181 | ||
| 189 | state = DP_S_DEFAULT; | 182 | state = DP_S_DEFAULT; |
| 190 | flags = currlen = cflags = min = 0; | 183 | flags = currlen = cflags = min = 0; |
| 191 | max = -1; | 184 | max = -1; |
| 192 | ch = *format++; | 185 | ch = *format++; |
| 193 | 186 | ||
| 194 | while (state != DP_S_DONE) { | 187 | while (state != DP_S_DONE) { |
| 195 | if (ch == '\0' || (buffer == NULL && currlen >= *maxlen)) | 188 | if (ch == '\0' || (buffer == NULL && currlen >= *maxlen)) |
| 196 | state = DP_S_DONE; | 189 | state = DP_S_DONE; |
| 197 | 190 | ||
| 198 | switch (state) { | 191 | switch (state) { |
| 199 | case DP_S_DEFAULT: | 192 | case DP_S_DEFAULT: |
| 200 | if (ch == '%') | 193 | if (ch == '%') |
| 201 | state = DP_S_FLAGS; | 194 | state = DP_S_FLAGS; |
| 202 | else | 195 | else |
| 203 | doapr_outch(sbuffer,buffer, &currlen, maxlen, ch); | 196 | doapr_outch(sbuffer, buffer, &currlen, maxlen, ch); |
| 204 | ch = *format++; | 197 | ch = *format++; |
| 205 | break; | 198 | break; |
| 206 | case DP_S_FLAGS: | 199 | case DP_S_FLAGS: |
| 207 | switch (ch) { | 200 | switch (ch) { |
| 208 | case '-': | 201 | case '-': |
| 209 | flags |= DP_F_MINUS; | 202 | flags |= DP_F_MINUS; |
| 210 | ch = *format++; | 203 | ch = *format++; |
| 211 | break; | 204 | break; |
| 212 | case '+': | 205 | case '+': |
| 213 | flags |= DP_F_PLUS; | 206 | flags |= DP_F_PLUS; |
| 214 | ch = *format++; | 207 | ch = *format++; |
| 215 | break; | 208 | break; |
| 216 | case ' ': | 209 | case ' ': |
| 217 | flags |= DP_F_SPACE; | 210 | flags |= DP_F_SPACE; |
| 218 | ch = *format++; | 211 | ch = *format++; |
| 219 | break; | 212 | break; |
| 220 | case '#': | 213 | case '#': |
| 221 | flags |= DP_F_NUM; | 214 | flags |= DP_F_NUM; |
| 222 | ch = *format++; | 215 | ch = *format++; |
| 223 | break; | 216 | break; |
| 224 | case '0': | 217 | case '0': |
| 225 | flags |= DP_F_ZERO; | 218 | flags |= DP_F_ZERO; |
| 226 | ch = *format++; | 219 | ch = *format++; |
| 227 | break; | 220 | break; |
| 228 | default: | 221 | default: |
| 229 | state = DP_S_MIN; | 222 | state = DP_S_MIN; |
| 230 | break; | 223 | break; |
| 231 | } | 224 | } |
| 232 | break; | 225 | break; |
| 233 | case DP_S_MIN: | 226 | case DP_S_MIN: |
| 234 | if (isdigit((unsigned char)ch)) { | 227 | if (isdigit((unsigned char)ch)) { |
| 235 | min = 10 * min + char_to_int(ch); | 228 | min = 10 * min + char_to_int(ch); |
| 236 | ch = *format++; | 229 | ch = *format++; |
| 237 | } else if (ch == '*') { | 230 | } else if (ch == '*') { |
| 238 | min = va_arg(args, int); | 231 | min = va_arg(args, int); |
| 239 | ch = *format++; | 232 | ch = *format++; |
| 240 | state = DP_S_DOT; | 233 | state = DP_S_DOT; |
| 241 | } else | 234 | } else |
| 242 | state = DP_S_DOT; | 235 | state = DP_S_DOT; |
| 243 | break; | 236 | break; |
| 244 | case DP_S_DOT: | 237 | case DP_S_DOT: |
| 245 | if (ch == '.') { | 238 | if (ch == '.') { |
| 246 | state = DP_S_MAX; | 239 | state = DP_S_MAX; |
| 247 | ch = *format++; | 240 | ch = *format++; |
| 248 | } else | 241 | } else |
| 249 | state = DP_S_MOD; | 242 | state = DP_S_MOD; |
| 250 | break; | 243 | break; |
| 251 | case DP_S_MAX: | 244 | case DP_S_MAX: |
| 252 | if (isdigit((unsigned char)ch)) { | 245 | if (isdigit((unsigned char)ch)) { |
| 253 | if (max < 0) | 246 | if (max < 0) |
| 254 | max = 0; | 247 | max = 0; |
| 255 | max = 10 * max + char_to_int(ch); | 248 | max = 10 * max + char_to_int(ch); |
| 256 | ch = *format++; | 249 | ch = *format++; |
| 257 | } else if (ch == '*') { | 250 | } else if (ch == '*') { |
| 258 | max = va_arg(args, int); | 251 | max = va_arg(args, int); |
| 259 | ch = *format++; | 252 | ch = *format++; |
| 260 | state = DP_S_MOD; | 253 | state = DP_S_MOD; |
| 261 | } else | 254 | } else |
| 262 | state = DP_S_MOD; | 255 | state = DP_S_MOD; |
| 263 | break; | 256 | break; |
| 264 | case DP_S_MOD: | 257 | case DP_S_MOD: |
| 265 | switch (ch) { | 258 | switch (ch) { |
| 266 | case 'h': | 259 | case 'h': |
| 267 | cflags = DP_C_SHORT; | 260 | cflags = DP_C_SHORT; |
| 268 | ch = *format++; | 261 | ch = *format++; |
| 269 | break; | 262 | break; |
| 270 | case 'l': | 263 | case 'l': |
| 271 | if (*format == 'l') { | 264 | if (*format == 'l') { |
| 272 | cflags = DP_C_LLONG; | 265 | cflags = DP_C_LLONG; |
| 273 | format++; | 266 | format++; |
| 274 | } else | 267 | } else |
| 275 | cflags = DP_C_LONG; | 268 | cflags = DP_C_LONG; |
| 276 | ch = *format++; | 269 | ch = *format++; |
| 277 | break; | 270 | break; |
| 278 | case 'q': | 271 | case 'q': |
| 279 | cflags = DP_C_LLONG; | 272 | cflags = DP_C_LLONG; |
| 280 | ch = *format++; | 273 | ch = *format++; |
| 281 | break; | 274 | break; |
| 282 | case 'L': | 275 | case 'L': |
| 283 | cflags = DP_C_LDOUBLE; | 276 | cflags = DP_C_LDOUBLE; |
| 284 | ch = *format++; | 277 | ch = *format++; |
| 285 | break; | 278 | break; |
| 286 | default: | 279 | default: |
| 287 | break; | 280 | break; |
| 288 | } | 281 | } |
| 289 | state = DP_S_CONV; | 282 | state = DP_S_CONV; |
| 290 | break; | 283 | break; |
| 291 | case DP_S_CONV: | 284 | case DP_S_CONV: |
| 292 | switch (ch) { | 285 | switch (ch) { |
| 293 | case 'd': | 286 | case 'd': |
| 294 | case 'i': | 287 | case 'i': |
| 295 | switch (cflags) { | 288 | switch (cflags) { |
| 296 | case DP_C_SHORT: | 289 | case DP_C_SHORT: |
| 297 | value = (short int)va_arg(args, int); | 290 | value = (short int)va_arg(args, int); |
| 298 | break; | 291 | break; |
| 299 | case DP_C_LONG: | 292 | case DP_C_LONG: |
| 300 | value = va_arg(args, long int); | 293 | value = va_arg(args, long int); |
| 301 | break; | 294 | break; |
| 302 | case DP_C_LLONG: | 295 | case DP_C_LLONG: |
| 303 | value = va_arg(args, LLONG); | 296 | value = va_arg(args, LLONG); |
| 304 | break; | 297 | break; |
| 305 | default: | 298 | default: |
| 306 | value = va_arg(args, int); | 299 | value = va_arg(args, int); |
| 307 | break; | 300 | break; |
| 308 | } | 301 | } |
| 309 | fmtint(sbuffer, buffer, &currlen, maxlen, | 302 | fmtint(sbuffer, buffer, &currlen, maxlen, |
| 310 | value, 10, min, max, flags); | 303 | value, 10, min, max, flags); |
| 311 | break; | 304 | break; |
| 312 | case 'X': | 305 | case 'X': |
| 313 | flags |= DP_F_UP; | 306 | flags |= DP_F_UP; |
| 314 | /* FALLTHROUGH */ | 307 | /* FALLTHROUGH */ |
| 315 | case 'x': | 308 | case 'x': |
| 316 | case 'o': | 309 | case 'o': |
| 317 | case 'u': | 310 | case 'u': |
| 318 | flags |= DP_F_UNSIGNED; | 311 | flags |= DP_F_UNSIGNED; |
| 319 | switch (cflags) { | 312 | switch (cflags) { |
| 320 | case DP_C_SHORT: | 313 | case DP_C_SHORT: |
| 321 | value = (unsigned short int)va_arg(args, unsigned int); | 314 | value = (unsigned short int)va_arg( |
| 322 | break; | 315 | args, unsigned int); |
| 323 | case DP_C_LONG: | 316 | break; |
| 324 | value = (LLONG) va_arg(args, | 317 | case DP_C_LONG: |
| 325 | unsigned long int); | 318 | value = (LLONG)va_arg(args, |
| 326 | break; | 319 | unsigned long int); |
| 327 | case DP_C_LLONG: | 320 | break; |
| 328 | value = va_arg(args, unsigned LLONG); | 321 | case DP_C_LLONG: |
| 329 | break; | 322 | value = va_arg(args, unsigned LLONG); |
| 330 | default: | 323 | break; |
| 331 | value = (LLONG) va_arg(args, | 324 | default: |
| 332 | unsigned int); | 325 | value = (LLONG)va_arg(args, |
| 333 | break; | 326 | unsigned int); |
| 334 | } | 327 | break; |
| 335 | fmtint(sbuffer, buffer, &currlen, maxlen, value, | 328 | } |
| 336 | ch == 'o' ? 8 : (ch == 'u' ? 10 : 16), | 329 | fmtint(sbuffer, buffer, &currlen, maxlen, value, |
| 337 | min, max, flags); | 330 | ch == 'o' ? 8 : (ch == 'u' ? 10 : 16), |
| 338 | break; | 331 | min, max, flags); |
| 339 | case 'f': | 332 | break; |
| 340 | if (cflags == DP_C_LDOUBLE) | 333 | case 'f': |
| 341 | fvalue = va_arg(args, LDOUBLE); | 334 | if (cflags == DP_C_LDOUBLE) |
| 342 | else | 335 | fvalue = va_arg(args, LDOUBLE); |
| 343 | fvalue = va_arg(args, double); | 336 | else |
| 344 | fmtfp(sbuffer, buffer, &currlen, maxlen, | 337 | fvalue = va_arg(args, double); |
| 345 | fvalue, min, max, flags); | 338 | fmtfp(sbuffer, buffer, &currlen, maxlen, |
| 346 | break; | 339 | fvalue, min, max, flags); |
| 347 | case 'E': | 340 | break; |
| 348 | flags |= DP_F_UP; | 341 | case 'E': |
| 349 | case 'e': | 342 | flags |= DP_F_UP; |
| 350 | if (cflags == DP_C_LDOUBLE) | 343 | case 'e': |
| 351 | fvalue = va_arg(args, LDOUBLE); | 344 | if (cflags == DP_C_LDOUBLE) |
| 352 | else | 345 | fvalue = va_arg(args, LDOUBLE); |
| 353 | fvalue = va_arg(args, double); | 346 | else |
| 354 | break; | 347 | fvalue = va_arg(args, double); |
| 355 | case 'G': | 348 | break; |
| 356 | flags |= DP_F_UP; | 349 | case 'G': |
| 357 | case 'g': | 350 | flags |= DP_F_UP; |
| 358 | if (cflags == DP_C_LDOUBLE) | 351 | case 'g': |
| 359 | fvalue = va_arg(args, LDOUBLE); | 352 | if (cflags == DP_C_LDOUBLE) |
| 360 | else | 353 | fvalue = va_arg(args, LDOUBLE); |
| 361 | fvalue = va_arg(args, double); | 354 | else |
| 362 | break; | 355 | fvalue = va_arg(args, double); |
| 363 | case 'c': | 356 | break; |
| 364 | doapr_outch(sbuffer, buffer, &currlen, maxlen, | 357 | case 'c': |
| 365 | va_arg(args, int)); | 358 | doapr_outch(sbuffer, buffer, &currlen, maxlen, |
| 366 | break; | 359 | va_arg(args, int)); |
| 367 | case 's': | 360 | break; |
| 368 | strvalue = va_arg(args, char *); | 361 | case 's': |
| 369 | if (max < 0) { | 362 | strvalue = va_arg(args, char *); |
| 370 | if (buffer) | 363 | if (max < 0) { |
| 371 | max = INT_MAX; | 364 | if (buffer) |
| 372 | else | 365 | max = INT_MAX; |
| 373 | max = *maxlen; | 366 | else |
| 367 | max = *maxlen; | ||
| 368 | } | ||
| 369 | fmtstr(sbuffer, buffer, &currlen, maxlen, | ||
| 370 | strvalue, flags, min, max); | ||
| 371 | break; | ||
| 372 | case 'p': | ||
| 373 | value = (long)va_arg(args, void *); | ||
| 374 | fmtint(sbuffer, buffer, &currlen, maxlen, | ||
| 375 | value, 16, min, max, flags|DP_F_NUM); | ||
| 376 | break; | ||
| 377 | case 'n': /* XXX */ | ||
| 378 | if (cflags == DP_C_SHORT) { | ||
| 379 | short int *num; | ||
| 380 | num = va_arg(args, short int *); | ||
| 381 | *num = currlen; | ||
| 382 | } else if (cflags == DP_C_LONG) { /* XXX */ | ||
| 383 | long int *num; | ||
| 384 | num = va_arg(args, long int *); | ||
| 385 | *num = (long int) currlen; | ||
| 386 | } else if (cflags == DP_C_LLONG) { /* XXX */ | ||
| 387 | LLONG *num; | ||
| 388 | num = va_arg(args, LLONG *); | ||
| 389 | *num = (LLONG) currlen; | ||
| 390 | } else { | ||
| 391 | int *num; | ||
| 392 | num = va_arg(args, int *); | ||
| 393 | *num = currlen; | ||
| 394 | } | ||
| 395 | break; | ||
| 396 | case '%': | ||
| 397 | doapr_outch(sbuffer, buffer, &currlen, maxlen, ch); | ||
| 398 | break; | ||
| 399 | case 'w': | ||
| 400 | /* not supported yet, treat as next char */ | ||
| 401 | ch = *format++; | ||
| 402 | break; | ||
| 403 | default: | ||
| 404 | /* unknown, skip */ | ||
| 405 | break; | ||
| 406 | } | ||
| 407 | ch = *format++; | ||
| 408 | state = DP_S_DEFAULT; | ||
| 409 | flags = cflags = min = 0; | ||
| 410 | max = -1; | ||
| 411 | break; | ||
| 412 | case DP_S_DONE: | ||
| 413 | break; | ||
| 414 | default: | ||
| 415 | break; | ||
| 374 | } | 416 | } |
| 375 | fmtstr(sbuffer, buffer, &currlen, maxlen, strvalue, | 417 | } |
| 376 | flags, min, max); | 418 | *truncated = (currlen > *maxlen - 1); |
| 377 | break; | 419 | if (*truncated) |
| 378 | case 'p': | 420 | currlen = *maxlen - 1; |
| 379 | value = (long)va_arg(args, void *); | 421 | doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0'); |
| 380 | fmtint(sbuffer, buffer, &currlen, maxlen, | 422 | *retlen = currlen - 1; |
| 381 | value, 16, min, max, flags|DP_F_NUM); | 423 | return; |
| 382 | break; | ||
| 383 | case 'n': /* XXX */ | ||
| 384 | if (cflags == DP_C_SHORT) { | ||
| 385 | short int *num; | ||
| 386 | num = va_arg(args, short int *); | ||
| 387 | *num = currlen; | ||
| 388 | } else if (cflags == DP_C_LONG) { /* XXX */ | ||
| 389 | long int *num; | ||
| 390 | num = va_arg(args, long int *); | ||
| 391 | *num = (long int) currlen; | ||
| 392 | } else if (cflags == DP_C_LLONG) { /* XXX */ | ||
| 393 | LLONG *num; | ||
| 394 | num = va_arg(args, LLONG *); | ||
| 395 | *num = (LLONG) currlen; | ||
| 396 | } else { | ||
| 397 | int *num; | ||
| 398 | num = va_arg(args, int *); | ||
| 399 | *num = currlen; | ||
| 400 | } | ||
| 401 | break; | ||
| 402 | case '%': | ||
| 403 | doapr_outch(sbuffer, buffer, &currlen, maxlen, ch); | ||
| 404 | break; | ||
| 405 | case 'w': | ||
| 406 | /* not supported yet, treat as next char */ | ||
| 407 | ch = *format++; | ||
| 408 | break; | ||
| 409 | default: | ||
| 410 | /* unknown, skip */ | ||
| 411 | break; | ||
| 412 | } | ||
| 413 | ch = *format++; | ||
| 414 | state = DP_S_DEFAULT; | ||
| 415 | flags = cflags = min = 0; | ||
| 416 | max = -1; | ||
| 417 | break; | ||
| 418 | case DP_S_DONE: | ||
| 419 | break; | ||
| 420 | default: | ||
| 421 | break; | ||
| 422 | } | ||
| 423 | } | ||
| 424 | *truncated = (currlen > *maxlen - 1); | ||
| 425 | if (*truncated) | ||
| 426 | currlen = *maxlen - 1; | ||
| 427 | doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0'); | ||
| 428 | *retlen = currlen - 1; | ||
| 429 | return; | ||
| 430 | } | 424 | } |
| 431 | 425 | ||
| 432 | static void | 426 | static void |
| 433 | fmtstr( | 427 | fmtstr(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen, |
| 434 | char **sbuffer, | 428 | const char *value, int flags, int min, int max) |
| 435 | char **buffer, | ||
| 436 | size_t *currlen, | ||
| 437 | size_t *maxlen, | ||
| 438 | const char *value, | ||
| 439 | int flags, | ||
| 440 | int min, | ||
| 441 | int max) | ||
| 442 | { | 429 | { |
| 443 | int padlen, strln; | 430 | int padlen, strln; |
| 444 | int cnt = 0; | 431 | int cnt = 0; |
| 445 | 432 | ||
| 446 | if (value == 0) | 433 | if (value == 0) |
| 447 | value = "<NULL>"; | 434 | value = "<NULL>"; |
| 448 | for (strln = 0; value[strln]; ++strln) | 435 | for (strln = 0; value[strln]; ++strln) |
| 449 | ; | 436 | ; |
| 450 | padlen = min - strln; | 437 | padlen = min - strln; |
| 451 | if (padlen < 0) | 438 | if (padlen < 0) |
| 452 | padlen = 0; | 439 | padlen = 0; |
| 453 | if (flags & DP_F_MINUS) | 440 | if (flags & DP_F_MINUS) |
| 454 | padlen = -padlen; | 441 | padlen = -padlen; |
| 455 | 442 | ||
| 456 | while ((padlen > 0) && (cnt < max)) { | 443 | while ((padlen > 0) && (cnt < max)) { |
| 457 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | 444 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
| 458 | --padlen; | 445 | --padlen; |
| 459 | ++cnt; | 446 | ++cnt; |
| 460 | } | 447 | } |
| 461 | while (*value && (cnt < max)) { | 448 | while (*value && (cnt < max)) { |
| 462 | doapr_outch(sbuffer, buffer, currlen, maxlen, *value++); | 449 | doapr_outch(sbuffer, buffer, currlen, maxlen, *value++); |
| 463 | ++cnt; | 450 | ++cnt; |
| 464 | } | 451 | } |
| 465 | while ((padlen < 0) && (cnt < max)) { | 452 | while ((padlen < 0) && (cnt < max)) { |
| 466 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | 453 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
| 467 | ++padlen; | 454 | ++padlen; |
| 468 | ++cnt; | 455 | ++cnt; |
| 469 | } | 456 | } |
| 470 | } | 457 | } |
| 471 | 458 | ||
| 472 | static void | 459 | static void |
| 473 | fmtint( | 460 | fmtint(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen, |
| 474 | char **sbuffer, | 461 | LLONG value, int base, int min, int max, int flags) |
| 475 | char **buffer, | ||
| 476 | size_t *currlen, | ||
| 477 | size_t *maxlen, | ||
| 478 | LLONG value, | ||
| 479 | int base, | ||
| 480 | int min, | ||
| 481 | int max, | ||
| 482 | int flags) | ||
| 483 | { | 462 | { |
| 484 | int signvalue = 0; | 463 | int signvalue = 0; |
| 485 | const char *prefix = ""; | 464 | const char *prefix = ""; |
| 486 | unsigned LLONG uvalue; | 465 | unsigned LLONG uvalue; |
| 487 | char convert[DECIMAL_SIZE(value)+3]; | 466 | char convert[DECIMAL_SIZE(value) + 3]; |
| 488 | int place = 0; | 467 | int place = 0; |
| 489 | int spadlen = 0; | 468 | int spadlen = 0; |
| 490 | int zpadlen = 0; | 469 | int zpadlen = 0; |
| 491 | int caps = 0; | 470 | int caps = 0; |
| 492 | 471 | ||
| 493 | if (max < 0) | 472 | if (max < 0) |
| 494 | max = 0; | 473 | max = 0; |
| 495 | uvalue = value; | 474 | uvalue = value; |
| 496 | if (!(flags & DP_F_UNSIGNED)) { | 475 | if (!(flags & DP_F_UNSIGNED)) { |
| 497 | if (value < 0) { | 476 | if (value < 0) { |
| 498 | signvalue = '-'; | 477 | signvalue = '-'; |
| 499 | uvalue = -value; | 478 | uvalue = -value; |
| 500 | } else if (flags & DP_F_PLUS) | 479 | } else if (flags & DP_F_PLUS) |
| 501 | signvalue = '+'; | 480 | signvalue = '+'; |
| 502 | else if (flags & DP_F_SPACE) | 481 | else if (flags & DP_F_SPACE) |
| 503 | signvalue = ' '; | 482 | signvalue = ' '; |
| 504 | } | 483 | } |
| 505 | if (flags & DP_F_NUM) { | 484 | if (flags & DP_F_NUM) { |
| 506 | if (base == 8) prefix = "0"; | 485 | if (base == 8) |
| 507 | if (base == 16) prefix = "0x"; | 486 | prefix = "0"; |
| 508 | } | 487 | if (base == 16) |
| 509 | if (flags & DP_F_UP) | 488 | prefix = "0x"; |
| 510 | caps = 1; | 489 | } |
| 511 | do { | 490 | if (flags & DP_F_UP) |
| 512 | convert[place++] = | 491 | caps = 1; |
| 513 | (caps ? "0123456789ABCDEF" : "0123456789abcdef") | 492 | do { |
| 514 | [uvalue % (unsigned) base]; | 493 | convert[place++] = (caps ? "0123456789ABCDEF" : |
| 515 | uvalue = (uvalue / (unsigned) base); | 494 | "0123456789abcdef")[uvalue % (unsigned) base]; |
| 516 | } while (uvalue && (place < (int)sizeof(convert))); | 495 | uvalue = (uvalue / (unsigned) base); |
| 517 | if (place == sizeof(convert)) | 496 | } while (uvalue && (place < (int)sizeof(convert))); |
| 518 | place--; | 497 | if (place == sizeof(convert)) |
| 519 | convert[place] = 0; | 498 | place--; |
| 520 | 499 | convert[place] = 0; | |
| 521 | zpadlen = max - place; | 500 | |
| 522 | spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0) - strlen(prefix); | 501 | zpadlen = max - place; |
| 523 | if (zpadlen < 0) | 502 | spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0) - |
| 524 | zpadlen = 0; | 503 | strlen(prefix); |
| 525 | if (spadlen < 0) | 504 | if (zpadlen < 0) |
| 526 | spadlen = 0; | 505 | zpadlen = 0; |
| 527 | if (flags & DP_F_ZERO) { | 506 | if (spadlen < 0) |
| 528 | zpadlen = OSSL_MAX(zpadlen, spadlen); | 507 | spadlen = 0; |
| 529 | spadlen = 0; | 508 | if (flags & DP_F_ZERO) { |
| 530 | } | 509 | zpadlen = OSSL_MAX(zpadlen, spadlen); |
| 531 | if (flags & DP_F_MINUS) | 510 | spadlen = 0; |
| 532 | spadlen = -spadlen; | 511 | } |
| 533 | 512 | if (flags & DP_F_MINUS) | |
| 534 | /* spaces */ | 513 | spadlen = -spadlen; |
| 535 | while (spadlen > 0) { | 514 | |
| 536 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | 515 | /* spaces */ |
| 537 | --spadlen; | 516 | while (spadlen > 0) { |
| 538 | } | 517 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
| 539 | 518 | --spadlen; | |
| 540 | /* sign */ | 519 | } |
| 541 | if (signvalue) | 520 | |
| 542 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); | 521 | /* sign */ |
| 543 | 522 | if (signvalue) | |
| 544 | /* prefix */ | 523 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); |
| 545 | while (*prefix) { | 524 | |
| 546 | doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix); | 525 | /* prefix */ |
| 547 | prefix++; | 526 | while (*prefix) { |
| 548 | } | 527 | doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix); |
| 549 | 528 | prefix++; | |
| 550 | /* zeros */ | 529 | } |
| 551 | if (zpadlen > 0) { | 530 | |
| 552 | while (zpadlen > 0) { | 531 | /* zeros */ |
| 553 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); | 532 | if (zpadlen > 0) { |
| 554 | --zpadlen; | 533 | while (zpadlen > 0) { |
| 555 | } | 534 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); |
| 556 | } | 535 | --zpadlen; |
| 557 | /* digits */ | 536 | } |
| 558 | while (place > 0) | 537 | } |
| 559 | doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]); | 538 | /* digits */ |
| 560 | 539 | while (place > 0) | |
| 561 | /* left justified spaces */ | 540 | doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]); |
| 562 | while (spadlen < 0) { | 541 | |
| 563 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | 542 | /* left justified spaces */ |
| 564 | ++spadlen; | 543 | while (spadlen < 0) { |
| 565 | } | 544 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
| 566 | return; | 545 | ++spadlen; |
| 546 | } | ||
| 547 | return; | ||
| 567 | } | 548 | } |
| 568 | 549 | ||
| 569 | static LDOUBLE | 550 | static LDOUBLE |
| 570 | abs_val(LDOUBLE value) | 551 | abs_val(LDOUBLE value) |
| 571 | { | 552 | { |
| 572 | LDOUBLE result = value; | 553 | LDOUBLE result = value; |
| 573 | if (value < 0) | 554 | if (value < 0) |
| 574 | result = -value; | 555 | result = -value; |
| 575 | return result; | 556 | return result; |
| 576 | } | 557 | } |
| 577 | 558 | ||
| 578 | static LDOUBLE | 559 | static LDOUBLE |
| 579 | pow_10(int in_exp) | 560 | pow_10(int in_exp) |
| 580 | { | 561 | { |
| 581 | LDOUBLE result = 1; | 562 | LDOUBLE result = 1; |
| 582 | while (in_exp) { | 563 | while (in_exp) { |
| 583 | result *= 10; | 564 | result *= 10; |
| 584 | in_exp--; | 565 | in_exp--; |
| 585 | } | 566 | } |
| 586 | return result; | 567 | return result; |
| 587 | } | 568 | } |
| 588 | 569 | ||
| 589 | static long | 570 | static long |
| 590 | roundv(LDOUBLE value) | 571 | roundv(LDOUBLE value) |
| 591 | { | 572 | { |
| 592 | long intpart; | 573 | long intpart; |
| 593 | intpart = (long) value; | 574 | intpart = (long) value; |
| 594 | value = value - intpart; | 575 | value = value - intpart; |
| 595 | if (value >= 0.5) | 576 | if (value >= 0.5) |
| 596 | intpart++; | 577 | intpart++; |
| 597 | return intpart; | 578 | return intpart; |
| 598 | } | 579 | } |
| 599 | 580 | ||
| 600 | static void | 581 | static void |
| 601 | fmtfp( | 582 | fmtfp(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen, |
| 602 | char **sbuffer, | 583 | LDOUBLE fvalue, int min, int max, int flags) |
| 603 | char **buffer, | ||
| 604 | size_t *currlen, | ||
| 605 | size_t *maxlen, | ||
| 606 | LDOUBLE fvalue, | ||
| 607 | int min, | ||
| 608 | int max, | ||
| 609 | int flags) | ||
| 610 | { | 584 | { |
| 611 | int signvalue = 0; | 585 | int signvalue = 0; |
| 612 | LDOUBLE ufvalue; | 586 | LDOUBLE ufvalue; |
| 613 | char iconvert[20]; | 587 | char iconvert[20]; |
| 614 | char fconvert[20]; | 588 | char fconvert[20]; |
| 615 | int iplace = 0; | 589 | int iplace = 0; |
| 616 | int fplace = 0; | 590 | int fplace = 0; |
| 617 | int padlen = 0; | 591 | int padlen = 0; |
| 618 | int zpadlen = 0; | 592 | int zpadlen = 0; |
| 619 | int caps = 0; | 593 | int caps = 0; |
| 620 | long intpart; | 594 | long intpart; |
| 621 | long fracpart; | 595 | long fracpart; |
| 622 | long max10; | 596 | long max10; |
| 623 | 597 | ||
| 624 | if (max < 0) | 598 | if (max < 0) |
| 625 | max = 6; | 599 | max = 6; |
| 626 | ufvalue = abs_val(fvalue); | 600 | ufvalue = abs_val(fvalue); |
| 627 | if (fvalue < 0) | 601 | if (fvalue < 0) |
| 628 | signvalue = '-'; | 602 | signvalue = '-'; |
| 629 | else if (flags & DP_F_PLUS) | 603 | else if (flags & DP_F_PLUS) |
| 630 | signvalue = '+'; | 604 | signvalue = '+'; |
| 631 | else if (flags & DP_F_SPACE) | 605 | else if (flags & DP_F_SPACE) |
| 632 | signvalue = ' '; | 606 | signvalue = ' '; |
| 633 | 607 | ||
| 634 | intpart = (long)ufvalue; | 608 | intpart = (long)ufvalue; |
| 635 | 609 | ||
| 636 | /* sorry, we only support 9 digits past the decimal because of our | 610 | /* sorry, we only support 9 digits past the decimal because of our |
| 637 | conversion method */ | 611 | conversion method */ |
| 638 | if (max > 9) | 612 | if (max > 9) |
| 639 | max = 9; | 613 | max = 9; |
| 640 | 614 | ||
| 641 | /* we "cheat" by converting the fractional part to integer by | 615 | /* we "cheat" by converting the fractional part to integer by |
| 642 | multiplying by a factor of 10 */ | 616 | multiplying by a factor of 10 */ |
| 643 | max10 = roundv(pow_10(max)); | 617 | max10 = roundv(pow_10(max)); |
| 644 | fracpart = roundv(pow_10(max) * (ufvalue - intpart)); | 618 | fracpart = roundv(pow_10(max) * (ufvalue - intpart)); |
| 645 | 619 | ||
| 646 | if (fracpart >= max10) { | 620 | if (fracpart >= max10) { |
| 647 | intpart++; | 621 | intpart++; |
| 648 | fracpart -= max10; | 622 | fracpart -= max10; |
| 649 | } | 623 | } |
| 650 | 624 | ||
| 651 | /* convert integer part */ | 625 | /* convert integer part */ |
| 652 | do { | 626 | do { |
| 653 | iconvert[iplace++] = | 627 | iconvert[iplace++] = (caps ? "0123456789ABCDEF" : |
| 654 | (caps ? "0123456789ABCDEF" | 628 | "0123456789abcdef")[intpart % 10]; |
| 655 | : "0123456789abcdef")[intpart % 10]; | 629 | intpart = (intpart / 10); |
| 656 | intpart = (intpart / 10); | 630 | } while (intpart && (iplace < (int)sizeof(iconvert))); |
| 657 | } while (intpart && (iplace < (int)sizeof(iconvert))); | 631 | if (iplace == sizeof iconvert) |
| 658 | if (iplace == sizeof iconvert) | 632 | iplace--; |
| 659 | iplace--; | 633 | iconvert[iplace] = 0; |
| 660 | iconvert[iplace] = 0; | 634 | |
| 661 | 635 | /* convert fractional part */ | |
| 662 | /* convert fractional part */ | 636 | do { |
| 663 | do { | 637 | fconvert[fplace++] = (caps ? "0123456789ABCDEF" : |
| 664 | fconvert[fplace++] = | 638 | "0123456789abcdef")[fracpart % 10]; |
| 665 | (caps ? "0123456789ABCDEF" | 639 | fracpart = (fracpart / 10); |
| 666 | : "0123456789abcdef")[fracpart % 10]; | 640 | } while (fplace < max); |
| 667 | fracpart = (fracpart / 10); | 641 | if (fplace == sizeof fconvert) |
| 668 | } while (fplace < max); | 642 | fplace--; |
| 669 | if (fplace == sizeof fconvert) | 643 | fconvert[fplace] = 0; |
| 670 | fplace--; | 644 | |
| 671 | fconvert[fplace] = 0; | 645 | /* -1 for decimal point, another -1 if we are printing a sign */ |
| 672 | 646 | padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); | |
| 673 | /* -1 for decimal point, another -1 if we are printing a sign */ | 647 | zpadlen = max - fplace; |
| 674 | padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); | 648 | if (zpadlen < 0) |
| 675 | zpadlen = max - fplace; | 649 | zpadlen = 0; |
| 676 | if (zpadlen < 0) | 650 | if (padlen < 0) |
| 677 | zpadlen = 0; | 651 | padlen = 0; |
| 678 | if (padlen < 0) | 652 | if (flags & DP_F_MINUS) |
| 679 | padlen = 0; | 653 | padlen = -padlen; |
| 680 | if (flags & DP_F_MINUS) | 654 | |
| 681 | padlen = -padlen; | 655 | if ((flags & DP_F_ZERO) && (padlen > 0)) { |
| 682 | 656 | if (signvalue) { | |
| 683 | if ((flags & DP_F_ZERO) && (padlen > 0)) { | 657 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); |
| 684 | if (signvalue) { | 658 | --padlen; |
| 685 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); | 659 | signvalue = 0; |
| 686 | --padlen; | 660 | } |
| 687 | signvalue = 0; | 661 | while (padlen > 0) { |
| 688 | } | 662 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); |
| 689 | while (padlen > 0) { | 663 | --padlen; |
| 690 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); | 664 | } |
| 691 | --padlen; | 665 | } |
| 692 | } | 666 | while (padlen > 0) { |
| 693 | } | 667 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
| 694 | while (padlen > 0) { | 668 | --padlen; |
| 695 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | 669 | } |
| 696 | --padlen; | 670 | if (signvalue) |
| 697 | } | 671 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); |
| 698 | if (signvalue) | 672 | |
| 699 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); | 673 | while (iplace > 0) |
| 700 | 674 | doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]); | |
| 701 | while (iplace > 0) | 675 | |
| 702 | doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]); | 676 | /* |
| 703 | 677 | * Decimal point. This should probably use locale to find the correct | |
| 704 | /* | 678 | * char to print out. |
| 705 | * Decimal point. This should probably use locale to find the correct | 679 | */ |
| 706 | * char to print out. | 680 | if (max > 0 || (flags & DP_F_NUM)) { |
| 707 | */ | 681 | doapr_outch(sbuffer, buffer, currlen, maxlen, '.'); |
| 708 | if (max > 0 || (flags & DP_F_NUM)) { | 682 | |
| 709 | doapr_outch(sbuffer, buffer, currlen, maxlen, '.'); | 683 | while (fplace > 0) |
| 710 | 684 | doapr_outch(sbuffer, buffer, currlen, maxlen, fconvert[--fplace]); | |
| 711 | while (fplace > 0) | 685 | } |
| 712 | doapr_outch(sbuffer, buffer, currlen, maxlen, fconvert[--fplace]); | 686 | while (zpadlen > 0) { |
| 713 | } | 687 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); |
| 714 | while (zpadlen > 0) { | 688 | --zpadlen; |
| 715 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); | 689 | } |
| 716 | --zpadlen; | 690 | |
| 717 | } | 691 | while (padlen < 0) { |
| 718 | 692 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | |
| 719 | while (padlen < 0) { | 693 | ++padlen; |
| 720 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | 694 | } |
| 721 | ++padlen; | ||
| 722 | } | ||
| 723 | } | 695 | } |
| 724 | 696 | ||
| 725 | static void | 697 | static void |
| 726 | doapr_outch( | 698 | doapr_outch(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen, |
| 727 | char **sbuffer, | ||
| 728 | char **buffer, | ||
| 729 | size_t *currlen, | ||
| 730 | size_t *maxlen, | ||
| 731 | int c) | 699 | int c) |
| 732 | { | 700 | { |
| 733 | /* If we haven't at least one buffer, someone has doe a big booboo */ | 701 | /* If we haven't at least one buffer, someone has doe a big booboo */ |
| 734 | assert(*sbuffer != NULL || buffer != NULL); | 702 | assert(*sbuffer != NULL || buffer != NULL); |
| 735 | 703 | ||
| 736 | if (buffer) { | 704 | if (buffer) { |
| 737 | while (*currlen >= *maxlen) { | 705 | while (*currlen >= *maxlen) { |
| 738 | if (*buffer == NULL) { | 706 | if (*buffer == NULL) { |
| 739 | if (*maxlen == 0) | 707 | if (*maxlen == 0) |
| 740 | *maxlen = 1024; | 708 | *maxlen = 1024; |
| 741 | *buffer = OPENSSL_malloc(*maxlen); | 709 | *buffer = OPENSSL_malloc(*maxlen); |
| 742 | if (*currlen > 0) { | 710 | if (*currlen > 0) { |
| 743 | assert(*sbuffer != NULL); | 711 | assert(*sbuffer != NULL); |
| 744 | memcpy(*buffer, *sbuffer, *currlen); | 712 | memcpy(*buffer, *sbuffer, *currlen); |
| 713 | } | ||
| 714 | *sbuffer = NULL; | ||
| 715 | } else { | ||
| 716 | *maxlen += 1024; | ||
| 717 | *buffer = OPENSSL_realloc(*buffer, *maxlen); | ||
| 718 | } | ||
| 745 | } | 719 | } |
| 746 | *sbuffer = NULL; | 720 | /* What to do if *buffer is NULL? */ |
| 747 | } else { | 721 | assert(*sbuffer != NULL || *buffer != NULL); |
| 748 | *maxlen += 1024; | ||
| 749 | *buffer = OPENSSL_realloc(*buffer, *maxlen); | ||
| 750 | } | ||
| 751 | } | 722 | } |
| 752 | /* What to do if *buffer is NULL? */ | ||
| 753 | assert(*sbuffer != NULL || *buffer != NULL); | ||
| 754 | } | ||
| 755 | 723 | ||
| 756 | if (*currlen < *maxlen) { | 724 | if (*currlen < *maxlen) { |
| 757 | if (*sbuffer) | 725 | if (*sbuffer) |
| 758 | (*sbuffer)[(*currlen)++] = (char)c; | 726 | (*sbuffer)[(*currlen)++] = (char)c; |
| 759 | else | 727 | else |
| 760 | (*buffer)[(*currlen)++] = (char)c; | 728 | (*buffer)[(*currlen)++] = (char)c; |
| 761 | } | 729 | } |
| 762 | 730 | ||
| 763 | return; | 731 | return; |
| 764 | } | 732 | } |
| 765 | 733 | ||
| 766 | /***************************************************************************/ | 734 | /***************************************************************************/ |
| 767 | 735 | ||
| 768 | int BIO_printf (BIO *bio, const char *format, ...) | 736 | int BIO_printf (BIO *bio, const char *format, ...) |
| 769 | { | 737 | { |
| 770 | va_list args; | 738 | va_list args; |
| 771 | int ret; | 739 | int ret; |
| 772 | 740 | ||
| @@ -775,15 +743,15 @@ int BIO_printf (BIO *bio, const char *format, ...) | |||
| 775 | ret = BIO_vprintf(bio, format, args); | 743 | ret = BIO_vprintf(bio, format, args); |
| 776 | 744 | ||
| 777 | va_end(args); | 745 | va_end(args); |
| 778 | return(ret); | 746 | return (ret); |
| 779 | } | 747 | } |
| 780 | 748 | ||
| 781 | int BIO_vprintf (BIO *bio, const char *format, va_list args) | 749 | int BIO_vprintf (BIO *bio, const char *format, va_list args) |
| 782 | { | 750 | { |
| 783 | int ret; | 751 | int ret; |
| 784 | size_t retlen; | 752 | size_t retlen; |
| 785 | char hugebuf[1024*2]; /* Was previously 10k, which is unreasonable | 753 | char hugebuf[1024*2]; /* Was previously 10k, which is unreasonable |
| 786 | in small-stack environments, like threads | 754 | in small - stack environments, like threads |
| 787 | or DOS programs. */ | 755 | or DOS programs. */ |
| 788 | char *hugebufp = hugebuf; | 756 | char *hugebufp = hugebuf; |
| 789 | size_t hugebufsize = sizeof(hugebuf); | 757 | size_t hugebufsize = sizeof(hugebuf); |
| @@ -792,27 +760,25 @@ int BIO_vprintf (BIO *bio, const char *format, va_list args) | |||
| 792 | 760 | ||
| 793 | dynbuf = NULL; | 761 | dynbuf = NULL; |
| 794 | CRYPTO_push_info("doapr()"); | 762 | CRYPTO_push_info("doapr()"); |
| 795 | _dopr(&hugebufp, &dynbuf, &hugebufsize, | 763 | _dopr(&hugebufp, &dynbuf, &hugebufsize, &retlen, &ignored, |
| 796 | &retlen, &ignored, format, args); | 764 | format, args); |
| 797 | if (dynbuf) | 765 | if (dynbuf) { |
| 798 | { | 766 | ret = BIO_write(bio, dynbuf, (int)retlen); |
| 799 | ret=BIO_write(bio, dynbuf, (int)retlen); | ||
| 800 | OPENSSL_free(dynbuf); | 767 | OPENSSL_free(dynbuf); |
| 801 | } | 768 | } else { |
| 802 | else | 769 | ret = BIO_write(bio, hugebuf, (int)retlen); |
| 803 | { | ||
| 804 | ret=BIO_write(bio, hugebuf, (int)retlen); | ||
| 805 | } | ||
| 806 | CRYPTO_pop_info(); | ||
| 807 | return(ret); | ||
| 808 | } | 770 | } |
| 771 | CRYPTO_pop_info(); | ||
| 772 | return (ret); | ||
| 773 | } | ||
| 809 | 774 | ||
| 810 | /* As snprintf is not available everywhere, we provide our own implementation. | 775 | /* As snprintf is not available everywhere, we provide our own implementation. |
| 811 | * This function has nothing to do with BIOs, but it's closely related | 776 | * This function has nothing to do with BIOs, but it's closely related |
| 812 | * to BIO_printf, and we need *some* name prefix ... | 777 | * to BIO_printf, and we need *some* name prefix ... |
| 813 | * (XXX the function should be renamed, but to what?) */ | 778 | * (XXX the function should be renamed, but to what?) */ |
| 814 | int BIO_snprintf(char *buf, size_t n, const char *format, ...) | 779 | int |
| 815 | { | 780 | BIO_snprintf(char *buf, size_t n, const char *format, ...) |
| 781 | { | ||
| 816 | va_list args; | 782 | va_list args; |
| 817 | int ret; | 783 | int ret; |
| 818 | 784 | ||
| @@ -821,11 +787,12 @@ int BIO_snprintf(char *buf, size_t n, const char *format, ...) | |||
| 821 | ret = BIO_vsnprintf(buf, n, format, args); | 787 | ret = BIO_vsnprintf(buf, n, format, args); |
| 822 | 788 | ||
| 823 | va_end(args); | 789 | va_end(args); |
| 824 | return(ret); | 790 | return (ret); |
| 825 | } | 791 | } |
| 826 | 792 | ||
| 827 | int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) | 793 | int |
| 828 | { | 794 | BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) |
| 795 | { | ||
| 829 | size_t retlen; | 796 | size_t retlen; |
| 830 | int truncated; | 797 | int truncated; |
| 831 | 798 | ||
| @@ -839,4 +806,4 @@ int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) | |||
| 839 | return -1; | 806 | return -1; |
| 840 | else | 807 | else |
| 841 | return (retlen <= INT_MAX) ? (int)retlen : -1; | 808 | return (retlen <= INT_MAX) ? (int)retlen : -1; |
| 842 | } | 809 | } |
diff --git a/src/lib/libcrypto/bio/b_sock.c b/src/lib/libcrypto/bio/b_sock.c index bd43307456..d739452580 100644 --- a/src/lib/libcrypto/bio/b_sock.c +++ b/src/lib/libcrypto/bio/b_sock.c | |||
| @@ -85,7 +85,7 @@ NETDB_DEFINE_CONTEXT | |||
| 85 | #endif | 85 | #endif |
| 86 | 86 | ||
| 87 | #if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) | 87 | #if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) |
| 88 | static int wsa_init_done=0; | 88 | static int wsa_init_done = 0; |
| 89 | #endif | 89 | #endif |
| 90 | 90 | ||
| 91 | /* | 91 | /* |
| @@ -100,36 +100,36 @@ static int wsa_init_done=0; | |||
| 100 | #endif | 100 | #endif |
| 101 | 101 | ||
| 102 | #if 0 | 102 | #if 0 |
| 103 | static unsigned long BIO_ghbn_hits=0L; | 103 | static unsigned long BIO_ghbn_hits = 0L; |
| 104 | static unsigned long BIO_ghbn_miss=0L; | 104 | static unsigned long BIO_ghbn_miss = 0L; |
| 105 | 105 | ||
| 106 | #define GHBN_NUM 4 | 106 | #define GHBN_NUM 4 |
| 107 | static struct ghbn_cache_st | 107 | static struct ghbn_cache_st { |
| 108 | { | ||
| 109 | char name[129]; | 108 | char name[129]; |
| 110 | struct hostent *ent; | 109 | struct hostent *ent; |
| 111 | unsigned long order; | 110 | unsigned long order; |
| 112 | } ghbn_cache[GHBN_NUM]; | 111 | } ghbn_cache[GHBN_NUM]; |
| 113 | #endif | 112 | #endif |
| 114 | 113 | ||
| 115 | static int get_ip(const char *str,unsigned char *ip); | 114 | static int get_ip(const char *str, unsigned char *ip); |
| 116 | #if 0 | 115 | #if 0 |
| 117 | static void ghbn_free(struct hostent *a); | 116 | static void ghbn_free(struct hostent *a); |
| 118 | static struct hostent *ghbn_dup(struct hostent *a); | 117 | static struct hostent *ghbn_dup(struct hostent *a); |
| 119 | #endif | 118 | #endif |
| 120 | int BIO_get_host_ip(const char *str, unsigned char *ip) | 119 | |
| 121 | { | 120 | int |
| 121 | BIO_get_host_ip(const char *str, unsigned char *ip) | ||
| 122 | { | ||
| 122 | int i; | 123 | int i; |
| 123 | int err = 1; | 124 | int err = 1; |
| 124 | int locked = 0; | 125 | int locked = 0; |
| 125 | struct hostent *he; | 126 | struct hostent *he; |
| 126 | 127 | ||
| 127 | i=get_ip(str,ip); | 128 | i = get_ip(str, ip); |
| 128 | if (i < 0) | 129 | if (i < 0) { |
| 129 | { | 130 | BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_INVALID_IP_ADDRESS); |
| 130 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS); | ||
| 131 | goto err; | 131 | goto err; |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | /* At this point, we have something that is most probably correct | 134 | /* At this point, we have something that is most probably correct |
| 135 | in some way, so let's init the socket. */ | 135 | in some way, so let's init the socket. */ |
| @@ -138,172 +138,169 @@ int BIO_get_host_ip(const char *str, unsigned char *ip) | |||
| 138 | 138 | ||
| 139 | /* If the string actually contained an IP address, we need not do | 139 | /* If the string actually contained an IP address, we need not do |
| 140 | anything more */ | 140 | anything more */ |
| 141 | if (i > 0) return(1); | 141 | if (i > 0) |
| 142 | return (1); | ||
| 142 | 143 | ||
| 143 | /* do a gethostbyname */ | 144 | /* do a gethostbyname */ |
| 144 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); | 145 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); |
| 145 | locked = 1; | 146 | locked = 1; |
| 146 | he=BIO_gethostbyname(str); | 147 | he = BIO_gethostbyname(str); |
| 147 | if (he == NULL) | 148 | if (he == NULL) { |
| 148 | { | 149 | BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_BAD_HOSTNAME_LOOKUP); |
| 149 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP); | ||
| 150 | goto err; | 150 | goto err; |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | /* cast to short because of win16 winsock definition */ | 153 | /* cast to short because of win16 winsock definition */ |
| 154 | if ((short)he->h_addrtype != AF_INET) | 154 | if ((short)he->h_addrtype != AF_INET) { |
| 155 | { | 155 | BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET); |
| 156 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET); | ||
| 157 | goto err; | 156 | goto err; |
| 158 | } | 157 | } |
| 159 | for (i=0; i<4; i++) | 158 | for (i = 0; i < 4; i++) |
| 160 | ip[i]=he->h_addr_list[0][i]; | 159 | ip[i] = he->h_addr_list[0][i]; |
| 161 | err = 0; | 160 | err = 0; |
| 162 | 161 | ||
| 163 | err: | 162 | err: |
| 164 | if (locked) | 163 | if (locked) |
| 165 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); | 164 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); |
| 166 | if (err) | 165 | if (err) { |
| 167 | { | 166 | ERR_add_error_data(2, "host=", str); |
| 168 | ERR_add_error_data(2,"host=",str); | ||
| 169 | return 0; | 167 | return 0; |
| 170 | } | 168 | } else |
| 171 | else | ||
| 172 | return 1; | 169 | return 1; |
| 173 | } | 170 | } |
| 174 | 171 | ||
| 175 | int BIO_get_port(const char *str, unsigned short *port_ptr) | 172 | int |
| 176 | { | 173 | BIO_get_port(const char *str, unsigned short *port_ptr) |
| 174 | { | ||
| 177 | int i; | 175 | int i; |
| 178 | struct servent *s; | 176 | struct servent *s; |
| 179 | 177 | ||
| 180 | if (str == NULL) | 178 | if (str == NULL) { |
| 181 | { | 179 | BIOerr(BIO_F_BIO_GET_PORT, BIO_R_NO_PORT_DEFINED); |
| 182 | BIOerr(BIO_F_BIO_GET_PORT,BIO_R_NO_PORT_DEFINED); | 180 | return (0); |
| 183 | return(0); | 181 | } |
| 184 | } | 182 | i = atoi(str); |
| 185 | i=atoi(str); | ||
| 186 | if (i != 0) | 183 | if (i != 0) |
| 187 | *port_ptr=(unsigned short)i; | 184 | *port_ptr = (unsigned short)i; |
| 188 | else | 185 | else { |
| 189 | { | ||
| 190 | CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME); | 186 | CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME); |
| 191 | /* Note: under VMS with SOCKETSHR, it seems like the first | 187 | /* Note: under VMS with SOCKETSHR, it seems like the first |
| 192 | * parameter is 'char *', instead of 'const char *' | 188 | * parameter is 'char *', instead of 'const char *' |
| 193 | */ | 189 | */ |
| 194 | #ifndef CONST_STRICT | 190 | #ifndef CONST_STRICT |
| 195 | s=getservbyname((char *)str,"tcp"); | 191 | s = getservbyname((char *)str, "tcp"); |
| 196 | #else | 192 | #else |
| 197 | s=getservbyname(str,"tcp"); | 193 | s = getservbyname(str, "tcp"); |
| 198 | #endif | 194 | #endif |
| 199 | if(s != NULL) | 195 | if (s != NULL) |
| 200 | *port_ptr=ntohs((unsigned short)s->s_port); | 196 | *port_ptr = ntohs((unsigned short)s->s_port); |
| 201 | CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME); | 197 | CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME); |
| 202 | if(s == NULL) | 198 | if (s == NULL) { |
| 203 | { | 199 | if (strcmp(str, "http") == 0) |
| 204 | if (strcmp(str,"http") == 0) | 200 | *port_ptr = 80; |
| 205 | *port_ptr=80; | 201 | else if (strcmp(str, "telnet") == 0) |
| 206 | else if (strcmp(str,"telnet") == 0) | 202 | *port_ptr = 23; |
| 207 | *port_ptr=23; | 203 | else if (strcmp(str, "socks") == 0) |
| 208 | else if (strcmp(str,"socks") == 0) | 204 | *port_ptr = 1080; |
| 209 | *port_ptr=1080; | 205 | else if (strcmp(str, "https") == 0) |
| 210 | else if (strcmp(str,"https") == 0) | 206 | *port_ptr = 443; |
| 211 | *port_ptr=443; | 207 | else if (strcmp(str, "ssl") == 0) |
| 212 | else if (strcmp(str,"ssl") == 0) | 208 | *port_ptr = 443; |
| 213 | *port_ptr=443; | 209 | else if (strcmp(str, "ftp") == 0) |
| 214 | else if (strcmp(str,"ftp") == 0) | 210 | *port_ptr = 21; |
| 215 | *port_ptr=21; | 211 | else if (strcmp(str, "gopher") == 0) |
| 216 | else if (strcmp(str,"gopher") == 0) | 212 | *port_ptr = 70; |
| 217 | *port_ptr=70; | ||
| 218 | #if 0 | 213 | #if 0 |
| 219 | else if (strcmp(str,"wais") == 0) | 214 | else if (strcmp(str, "wais") == 0) |
| 220 | *port_ptr=21; | 215 | *port_ptr = 21; |
| 221 | #endif | 216 | #endif |
| 222 | else | 217 | else { |
| 223 | { | 218 | SYSerr(SYS_F_GETSERVBYNAME, errno); |
| 224 | SYSerr(SYS_F_GETSERVBYNAME,errno); | 219 | ERR_add_error_data(3, "service = '", str, "'"); |
| 225 | ERR_add_error_data(3,"service='",str,"'"); | 220 | return (0); |
| 226 | return(0); | ||
| 227 | } | ||
| 228 | } | 221 | } |
| 229 | } | 222 | } |
| 230 | return(1); | ||
| 231 | } | 223 | } |
| 224 | return (1); | ||
| 225 | } | ||
| 232 | 226 | ||
| 233 | int BIO_sock_error(int sock) | 227 | int |
| 234 | { | 228 | BIO_sock_error(int sock) |
| 235 | int j,i; | 229 | { |
| 230 | int j, i; | ||
| 236 | int size; | 231 | int size; |
| 237 | 232 | ||
| 238 | #if defined(OPENSSL_SYS_BEOS_R5) | 233 | #if defined(OPENSSL_SYS_BEOS_R5) |
| 239 | return 0; | 234 | return 0; |
| 240 | #endif | 235 | #endif |
| 241 | 236 | ||
| 242 | size=sizeof(int); | 237 | size = sizeof(int); |
| 243 | /* Note: under Windows the third parameter is of type (char *) | 238 | /* Note: under Windows the third parameter is of type (char *) |
| 244 | * whereas under other systems it is (void *) if you don't have | 239 | * whereas under other systems it is (void *) if you don't have |
| 245 | * a cast it will choke the compiler: if you do have a cast then | 240 | * a cast it will choke the compiler: if you do have a cast then |
| 246 | * you can either go for (char *) or (void *). | 241 | * you can either go for (char *) or (void *). |
| 247 | */ | 242 | */ |
| 248 | i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(void *)&j,(void *)&size); | 243 | i = getsockopt(sock, SOL_SOCKET, SO_ERROR,(void *)&j,(void *)&size); |
| 249 | if (i < 0) | 244 | if (i < 0) |
| 250 | return(1); | 245 | return (1); |
| 251 | else | 246 | else |
| 252 | return(j); | 247 | return (j); |
| 253 | } | 248 | } |
| 254 | 249 | ||
| 255 | #if 0 | 250 | #if 0 |
| 256 | long BIO_ghbn_ctrl(int cmd, int iarg, char *parg) | 251 | long |
| 257 | { | 252 | BIO_ghbn_ctrl(int cmd, int iarg, char *parg) |
| 253 | { | ||
| 258 | int i; | 254 | int i; |
| 259 | char **p; | 255 | char **p; |
| 260 | 256 | ||
| 261 | switch (cmd) | 257 | switch (cmd) { |
| 262 | { | ||
| 263 | case BIO_GHBN_CTRL_HITS: | 258 | case BIO_GHBN_CTRL_HITS: |
| 264 | return(BIO_ghbn_hits); | 259 | return (BIO_ghbn_hits); |
| 265 | /* break; */ | 260 | /* break; */ |
| 266 | case BIO_GHBN_CTRL_MISSES: | 261 | case BIO_GHBN_CTRL_MISSES: |
| 267 | return(BIO_ghbn_miss); | 262 | return (BIO_ghbn_miss); |
| 268 | /* break; */ | 263 | /* break; */ |
| 269 | case BIO_GHBN_CTRL_CACHE_SIZE: | 264 | case BIO_GHBN_CTRL_CACHE_SIZE: |
| 270 | return(GHBN_NUM); | 265 | return (GHBN_NUM); |
| 271 | /* break; */ | 266 | /* break; */ |
| 272 | case BIO_GHBN_CTRL_GET_ENTRY: | 267 | case BIO_GHBN_CTRL_GET_ENTRY: |
| 273 | if ((iarg >= 0) && (iarg <GHBN_NUM) && | 268 | if ((iarg >= 0) && (iarg < GHBN_NUM) && |
| 274 | (ghbn_cache[iarg].order > 0)) | 269 | (ghbn_cache[iarg].order > 0)) { |
| 275 | { | 270 | p = (char **)parg; |
| 276 | p=(char **)parg; | 271 | if (p == NULL) |
| 277 | if (p == NULL) return(0); | 272 | return (0); |
| 278 | *p=ghbn_cache[iarg].name; | 273 | *p = ghbn_cache[iarg].name; |
| 279 | ghbn_cache[iarg].name[128]='\0'; | 274 | ghbn_cache[iarg].name[128] = '\0'; |
| 280 | return(1); | 275 | return (1); |
| 281 | } | 276 | } |
| 282 | return(0); | 277 | return (0); |
| 283 | /* break; */ | 278 | /* break; */ |
| 284 | case BIO_GHBN_CTRL_FLUSH: | 279 | case BIO_GHBN_CTRL_FLUSH: |
| 285 | for (i=0; i<GHBN_NUM; i++) | 280 | for (i = 0; i < GHBN_NUM; i++) |
| 286 | ghbn_cache[i].order=0; | 281 | ghbn_cache[i].order = 0; |
| 287 | break; | 282 | break; |
| 288 | default: | 283 | default: |
| 289 | return(0); | 284 | return (0); |
| 290 | } | ||
| 291 | return(1); | ||
| 292 | } | 285 | } |
| 286 | return (1); | ||
| 287 | } | ||
| 293 | #endif | 288 | #endif |
| 294 | 289 | ||
| 295 | #if 0 | 290 | #if 0 |
| 296 | static struct hostent *ghbn_dup(struct hostent *a) | 291 | static struct hostent |
| 297 | { | 292 | *ghbn_dup(struct hostent *a) |
| 293 | { | ||
| 298 | struct hostent *ret; | 294 | struct hostent *ret; |
| 299 | int i,j; | 295 | int i, j; |
| 300 | 296 | ||
| 301 | MemCheck_off(); | 297 | MemCheck_off(); |
| 302 | ret=(struct hostent *)OPENSSL_malloc(sizeof(struct hostent)); | 298 | ret = (struct hostent *)OPENSSL_malloc(sizeof(struct hostent)); |
| 303 | if (ret == NULL) return(NULL); | 299 | if (ret == NULL) |
| 304 | memset(ret,0,sizeof(struct hostent)); | 300 | return (NULL); |
| 301 | memset(ret, 0, sizeof(struct hostent)); | ||
| 305 | 302 | ||
| 306 | for (i=0; a->h_aliases[i] != NULL; i++) | 303 | for (i = 0; a->h_aliases[i] != NULL; i++) |
| 307 | ; | 304 | ; |
| 308 | i++; | 305 | i++; |
| 309 | ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *)); | 306 | ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *)); |
| @@ -311,69 +308,66 @@ static struct hostent *ghbn_dup(struct hostent *a) | |||
| 311 | goto err; | 308 | goto err; |
| 312 | memset(ret->h_aliases, 0, i*sizeof(char *)); | 309 | memset(ret->h_aliases, 0, i*sizeof(char *)); |
| 313 | 310 | ||
| 314 | for (i=0; a->h_addr_list[i] != NULL; i++) | 311 | for (i = 0; a->h_addr_list[i] != NULL; i++) |
| 315 | ; | 312 | ; |
| 316 | i++; | 313 | i++; |
| 317 | ret->h_addr_list=(char **)OPENSSL_malloc(i*sizeof(char *)); | 314 | ret->h_addr_list = (char **)OPENSSL_malloc(i*sizeof(char *)); |
| 318 | if (ret->h_addr_list == NULL) | 315 | if (ret->h_addr_list == NULL) |
| 319 | goto err; | 316 | goto err; |
| 320 | memset(ret->h_addr_list, 0, i*sizeof(char *)); | 317 | memset(ret->h_addr_list, 0, i*sizeof(char *)); |
| 321 | 318 | ||
| 322 | j=strlen(a->h_name)+1; | 319 | j = strlen(a->h_name) + 1; |
| 323 | if ((ret->h_name=OPENSSL_malloc(j)) == NULL) goto err; | 320 | if ((ret->h_name = OPENSSL_malloc(j)) == NULL) goto err; |
| 324 | memcpy((char *)ret->h_name,a->h_name,j); | 321 | memcpy((char *)ret->h_name, a->h_name, j); |
| 325 | for (i=0; a->h_aliases[i] != NULL; i++) | 322 | for (i = 0; a->h_aliases[i] != NULL; i++) { |
| 326 | { | 323 | j = strlen(a->h_aliases[i]) + 1; |
| 327 | j=strlen(a->h_aliases[i])+1; | 324 | if ((ret->h_aliases[i] = OPENSSL_malloc(j)) == NULL) goto err; |
| 328 | if ((ret->h_aliases[i]=OPENSSL_malloc(j)) == NULL) goto err; | 325 | memcpy(ret->h_aliases[i], a->h_aliases[i], j); |
| 329 | memcpy(ret->h_aliases[i],a->h_aliases[i],j); | 326 | } |
| 330 | } | 327 | ret->h_length = a->h_length; |
| 331 | ret->h_length=a->h_length; | 328 | ret->h_addrtype = a->h_addrtype; |
| 332 | ret->h_addrtype=a->h_addrtype; | 329 | for (i = 0; a->h_addr_list[i] != NULL; i++) { |
| 333 | for (i=0; a->h_addr_list[i] != NULL; i++) | 330 | if ((ret->h_addr_list[i] = OPENSSL_malloc(a->h_length)) == NULL) |
| 334 | { | ||
| 335 | if ((ret->h_addr_list[i]=OPENSSL_malloc(a->h_length)) == NULL) | ||
| 336 | goto err; | 331 | goto err; |
| 337 | memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length); | 332 | memcpy(ret->h_addr_list[i], a->h_addr_list[i], a->h_length); |
| 338 | } | 333 | } |
| 339 | if (0) | 334 | if (0) { |
| 340 | { | 335 | err: |
| 341 | err: | ||
| 342 | if (ret != NULL) | 336 | if (ret != NULL) |
| 343 | ghbn_free(ret); | 337 | ghbn_free(ret); |
| 344 | ret=NULL; | 338 | ret = NULL; |
| 345 | } | ||
| 346 | MemCheck_on(); | ||
| 347 | return(ret); | ||
| 348 | } | 339 | } |
| 340 | MemCheck_on(); | ||
| 341 | return (ret); | ||
| 342 | } | ||
| 349 | 343 | ||
| 350 | static void ghbn_free(struct hostent *a) | 344 | static void |
| 351 | { | 345 | ghbn_free(struct hostent *a) |
| 346 | { | ||
| 352 | int i; | 347 | int i; |
| 353 | 348 | ||
| 354 | if(a == NULL) | 349 | if (a == NULL) |
| 355 | return; | 350 | return; |
| 356 | 351 | ||
| 357 | if (a->h_aliases != NULL) | 352 | if (a->h_aliases != NULL) { |
| 358 | { | 353 | for (i = 0; a->h_aliases[i] != NULL; i++) |
| 359 | for (i=0; a->h_aliases[i] != NULL; i++) | ||
| 360 | OPENSSL_free(a->h_aliases[i]); | 354 | OPENSSL_free(a->h_aliases[i]); |
| 361 | OPENSSL_free(a->h_aliases); | 355 | OPENSSL_free(a->h_aliases); |
| 362 | } | 356 | } |
| 363 | if (a->h_addr_list != NULL) | 357 | if (a->h_addr_list != NULL) { |
| 364 | { | 358 | for (i = 0; a->h_addr_list[i] != NULL; i++) |
| 365 | for (i=0; a->h_addr_list[i] != NULL; i++) | ||
| 366 | OPENSSL_free(a->h_addr_list[i]); | 359 | OPENSSL_free(a->h_addr_list[i]); |
| 367 | OPENSSL_free(a->h_addr_list); | 360 | OPENSSL_free(a->h_addr_list); |
| 368 | } | ||
| 369 | if (a->h_name != NULL) OPENSSL_free(a->h_name); | ||
| 370 | OPENSSL_free(a); | ||
| 371 | } | 361 | } |
| 362 | if (a->h_name != NULL) | ||
| 363 | OPENSSL_free(a->h_name); | ||
| 364 | OPENSSL_free(a); | ||
| 365 | } | ||
| 372 | 366 | ||
| 373 | #endif | 367 | #endif |
| 374 | 368 | ||
| 375 | struct hostent *BIO_gethostbyname(const char *name) | 369 | struct hostent |
| 376 | { | 370 | *BIO_gethostbyname(const char *name) { |
| 377 | #if 1 | 371 | #if 1 |
| 378 | /* Caching gethostbyname() results forever is wrong, | 372 | /* Caching gethostbyname() results forever is wrong, |
| 379 | * so we have to let the true gethostbyname() worry about this */ | 373 | * so we have to let the true gethostbyname() worry about this */ |
| @@ -384,8 +378,8 @@ struct hostent *BIO_gethostbyname(const char *name) | |||
| 384 | #endif | 378 | #endif |
| 385 | #else | 379 | #else |
| 386 | struct hostent *ret; | 380 | struct hostent *ret; |
| 387 | int i,lowi=0,j; | 381 | int i, lowi = 0, j; |
| 388 | unsigned long low= (unsigned long)-1; | 382 | unsigned long low = (unsigned long) - 1; |
| 389 | 383 | ||
| 390 | 384 | ||
| 391 | # if 0 | 385 | # if 0 |
| @@ -395,42 +389,37 @@ struct hostent *BIO_gethostbyname(const char *name) | |||
| 395 | */ | 389 | */ |
| 396 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); | 390 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); |
| 397 | # endif | 391 | # endif |
| 398 | j=strlen(name); | 392 | j = strlen(name); |
| 399 | if (j < 128) | 393 | if (j < 128) { |
| 400 | { | 394 | for (i = 0; i < GHBN_NUM; i++) { |
| 401 | for (i=0; i<GHBN_NUM; i++) | 395 | if (low > ghbn_cache[i].order) { |
| 402 | { | 396 | low = ghbn_cache[i].order; |
| 403 | if (low > ghbn_cache[i].order) | 397 | lowi = i; |
| 404 | { | 398 | } |
| 405 | low=ghbn_cache[i].order; | 399 | if (ghbn_cache[i].order > 0) { |
| 406 | lowi=i; | 400 | if (strncmp(name, ghbn_cache[i].name, 128) == 0) |
| 407 | } | ||
| 408 | if (ghbn_cache[i].order > 0) | ||
| 409 | { | ||
| 410 | if (strncmp(name,ghbn_cache[i].name,128) == 0) | ||
| 411 | break; | 401 | break; |
| 412 | } | ||
| 413 | } | 402 | } |
| 414 | } | 403 | } |
| 415 | else | 404 | } else |
| 416 | i=GHBN_NUM; | 405 | i = GHBN_NUM; |
| 417 | 406 | ||
| 418 | if (i == GHBN_NUM) /* no hit*/ | 407 | if (i == GHBN_NUM) /* no hit*/ |
| 419 | { | 408 | { |
| 420 | BIO_ghbn_miss++; | 409 | BIO_ghbn_miss++; |
| 421 | /* Note: under VMS with SOCKETSHR, it seems like the first | 410 | /* Note: under VMS with SOCKETSHR, it seems like the first |
| 422 | * parameter is 'char *', instead of 'const char *' | 411 | * parameter is 'char *', instead of 'const char *' |
| 423 | */ | 412 | */ |
| 424 | # ifndef CONST_STRICT | 413 | # ifndef CONST_STRICT |
| 425 | ret=gethostbyname((char *)name); | 414 | ret = gethostbyname((char *)name); |
| 426 | # else | 415 | # else |
| 427 | ret=gethostbyname(name); | 416 | ret = gethostbyname(name); |
| 428 | # endif | 417 | # endif |
| 429 | 418 | ||
| 430 | if (ret == NULL) | 419 | if (ret == NULL) |
| 431 | goto end; | 420 | goto end; |
| 432 | if (j > 128) /* too big to cache */ | 421 | if (j > 128) /* too big to cache */ |
| 433 | { | 422 | { |
| 434 | # if 0 | 423 | # if 0 |
| 435 | /* If we were trying to make this function thread-safe (which | 424 | /* If we were trying to make this function thread-safe (which |
| 436 | * is bound to fail), we'd have to give up in this case | 425 | * is bound to fail), we'd have to give up in this case |
| @@ -438,118 +427,113 @@ struct hostent *BIO_gethostbyname(const char *name) | |||
| 438 | ret = NULL; | 427 | ret = NULL; |
| 439 | # endif | 428 | # endif |
| 440 | goto end; | 429 | goto end; |
| 441 | } | 430 | } |
| 442 | 431 | ||
| 443 | /* else add to cache */ | 432 | /* else add to cache */ |
| 444 | if (ghbn_cache[lowi].ent != NULL) | 433 | if (ghbn_cache[lowi].ent != NULL) |
| 445 | ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */ | 434 | ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */ |
| 446 | ghbn_cache[lowi].name[0] = '\0'; | 435 | ghbn_cache[lowi].name[0] = '\0'; |
| 447 | 436 | ||
| 448 | if((ret=ghbn_cache[lowi].ent=ghbn_dup(ret)) == NULL) | 437 | if ((ret = ghbn_cache[lowi].ent = ghbn_dup(ret)) == NULL) { |
| 449 | { | 438 | BIOerr(BIO_F_BIO_GETHOSTBYNAME, ERR_R_MALLOC_FAILURE); |
| 450 | BIOerr(BIO_F_BIO_GETHOSTBYNAME,ERR_R_MALLOC_FAILURE); | ||
| 451 | goto end; | 439 | goto end; |
| 452 | } | ||
| 453 | strncpy(ghbn_cache[lowi].name,name,128); | ||
| 454 | ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits; | ||
| 455 | } | 440 | } |
| 456 | else | 441 | strncpy(ghbn_cache[lowi].name, name, 128); |
| 457 | { | 442 | ghbn_cache[lowi].order = BIO_ghbn_miss + BIO_ghbn_hits; |
| 443 | } else { | ||
| 458 | BIO_ghbn_hits++; | 444 | BIO_ghbn_hits++; |
| 459 | ret= ghbn_cache[i].ent; | 445 | ret = ghbn_cache[i].ent; |
| 460 | ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits; | 446 | ghbn_cache[i].order = BIO_ghbn_miss + BIO_ghbn_hits; |
| 461 | } | 447 | } |
| 462 | end: | 448 | end: |
| 463 | # if 0 | 449 | # if 0 |
| 464 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); | 450 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); |
| 465 | # endif | 451 | # endif |
| 466 | return(ret); | 452 | return (ret); |
| 467 | #endif | 453 | #endif |
| 468 | } | 454 | } |
| 469 | 455 | ||
| 470 | 456 | ||
| 471 | int BIO_sock_init(void) | 457 | int |
| 472 | { | 458 | BIO_sock_init(void) |
| 459 | { | ||
| 473 | #ifdef OPENSSL_SYS_WINDOWS | 460 | #ifdef OPENSSL_SYS_WINDOWS |
| 474 | static struct WSAData wsa_state; | 461 | static struct WSAData wsa_state; |
| 475 | 462 | ||
| 476 | if (!wsa_init_done) | 463 | if (!wsa_init_done) { |
| 477 | { | ||
| 478 | int err; | 464 | int err; |
| 479 | 465 | ||
| 480 | wsa_init_done=1; | 466 | wsa_init_done = 1; |
| 481 | memset(&wsa_state,0,sizeof(wsa_state)); | 467 | memset(&wsa_state, 0, sizeof(wsa_state)); |
| 482 | /* Not making wsa_state available to the rest of the | 468 | /* Not making wsa_state available to the rest of the |
| 483 | * code is formally wrong. But the structures we use | 469 | * code is formally wrong. But the structures we use |
| 484 | * are [beleived to be] invariable among Winsock DLLs, | 470 | * are [beleived to be] invariable among Winsock DLLs, |
| 485 | * while API availability is [expected to be] probed | 471 | * while API availability is [expected to be] probed |
| 486 | * at run-time with DSO_global_lookup. */ | 472 | * at run-time with DSO_global_lookup. */ |
| 487 | if (WSAStartup(0x0202,&wsa_state)!=0) | 473 | if (WSAStartup(0x0202, &wsa_state) != 0) { |
| 488 | { | 474 | err = WSAGetLastError(); |
| 489 | err=WSAGetLastError(); | 475 | SYSerr(SYS_F_WSASTARTUP, err); |
| 490 | SYSerr(SYS_F_WSASTARTUP,err); | 476 | BIOerr(BIO_F_BIO_SOCK_INIT, BIO_R_WSASTARTUP); |
| 491 | BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP); | 477 | return (-1); |
| 492 | return(-1); | ||
| 493 | } | ||
| 494 | } | 478 | } |
| 479 | } | ||
| 495 | #endif /* OPENSSL_SYS_WINDOWS */ | 480 | #endif /* OPENSSL_SYS_WINDOWS */ |
| 496 | #ifdef WATT32 | 481 | #ifdef WATT32 |
| 497 | extern int _watt_do_exit; | 482 | extern int _watt_do_exit; |
| 498 | _watt_do_exit = 0; /* don't make sock_init() call exit() */ | 483 | _watt_do_exit = 0; |
| 484 | /* don't make sock_init() call exit() */ | ||
| 499 | if (sock_init()) | 485 | if (sock_init()) |
| 500 | return (-1); | 486 | return (-1); |
| 501 | #endif | 487 | #endif |
| 502 | 488 | ||
| 503 | #if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) | 489 | #if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) |
| 504 | WORD wVerReq; | 490 | WORD wVerReq; |
| 505 | WSADATA wsaData; | 491 | WSADATA wsaData; |
| 506 | int err; | 492 | int err; |
| 507 | 493 | ||
| 508 | if (!wsa_init_done) | 494 | if (!wsa_init_done) { |
| 509 | { | 495 | wsa_init_done = 1; |
| 510 | wsa_init_done=1; | 496 | wVerReq = MAKEWORD( 2, 0 ); |
| 511 | wVerReq = MAKEWORD( 2, 0 ); | 497 | err = WSAStartup(wVerReq, &wsaData); |
| 512 | err = WSAStartup(wVerReq,&wsaData); | 498 | if (err != 0) { |
| 513 | if (err != 0) | 499 | SYSerr(SYS_F_WSASTARTUP, err); |
| 514 | { | 500 | BIOerr(BIO_F_BIO_SOCK_INIT, BIO_R_WSASTARTUP); |
| 515 | SYSerr(SYS_F_WSASTARTUP,err); | 501 | return (-1); |
| 516 | BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP); | ||
| 517 | return(-1); | ||
| 518 | } | ||
| 519 | } | 502 | } |
| 503 | } | ||
| 520 | #endif | 504 | #endif |
| 521 | 505 | ||
| 522 | return(1); | 506 | return (1); |
| 523 | } | 507 | } |
| 524 | 508 | ||
| 525 | void BIO_sock_cleanup(void) | 509 | void |
| 526 | { | 510 | BIO_sock_cleanup(void) |
| 511 | { | ||
| 527 | #ifdef OPENSSL_SYS_WINDOWS | 512 | #ifdef OPENSSL_SYS_WINDOWS |
| 528 | if (wsa_init_done) | 513 | if (wsa_init_done) { |
| 529 | { | 514 | wsa_init_done = 0; |
| 530 | wsa_init_done=0; | ||
| 531 | #if 0 /* this call is claimed to be non-present in Winsock2 */ | 515 | #if 0 /* this call is claimed to be non-present in Winsock2 */ |
| 532 | WSACancelBlockingCall(); | 516 | WSACancelBlockingCall(); |
| 533 | #endif | 517 | #endif |
| 534 | WSACleanup(); | 518 | WSACleanup(); |
| 535 | } | 519 | } |
| 536 | #elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) | 520 | #elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) |
| 537 | if (wsa_init_done) | 521 | if (wsa_init_done) { |
| 538 | { | 522 | wsa_init_done = 0; |
| 539 | wsa_init_done=0; | 523 | WSACleanup(); |
| 540 | WSACleanup(); | ||
| 541 | } | ||
| 542 | #endif | ||
| 543 | } | 524 | } |
| 525 | #endif | ||
| 526 | } | ||
| 544 | 527 | ||
| 545 | #if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000 | 528 | #if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000 |
| 546 | 529 | ||
| 547 | int BIO_socket_ioctl(int fd, long type, void *arg) | 530 | int |
| 548 | { | 531 | BIO_socket_ioctl(int fd, long type, void *arg) |
| 532 | { | ||
| 549 | int i; | 533 | int i; |
| 550 | 534 | ||
| 551 | #ifdef __DJGPP__ | 535 | #ifdef __DJGPP__ |
| 552 | i=ioctl(fd,type,(char *)arg); | 536 | i = ioctl(fd, type,(char *)arg); |
| 553 | #else | 537 | #else |
| 554 | # if defined(OPENSSL_SYS_VMS) | 538 | # if defined(OPENSSL_SYS_VMS) |
| 555 | /* 2011-02-18 SMS. | 539 | /* 2011-02-18 SMS. |
| @@ -574,402 +558,399 @@ int BIO_socket_ioctl(int fd, long type, void *arg) | |||
| 574 | # define ARG arg | 558 | # define ARG arg |
| 575 | # endif /* defined(OPENSSL_SYS_VMS) [else] */ | 559 | # endif /* defined(OPENSSL_SYS_VMS) [else] */ |
| 576 | 560 | ||
| 577 | i=ioctl(fd,type,ARG); | 561 | i = ioctl(fd, type, ARG); |
| 578 | #endif /* __DJGPP__ */ | 562 | #endif /* __DJGPP__ */ |
| 579 | if (i < 0) | 563 | if (i < 0) |
| 580 | SYSerr(SYS_F_IOCTLSOCKET,errno); | 564 | SYSerr(SYS_F_IOCTLSOCKET, errno); |
| 581 | return(i); | 565 | return (i); |
| 582 | } | 566 | } |
| 583 | #endif /* __VMS_VER */ | 567 | #endif /* __VMS_VER */ |
| 584 | 568 | ||
| 585 | /* The reason I have implemented this instead of using sscanf is because | 569 | /* The reason I have implemented this instead of using sscanf is because |
| 586 | * Visual C 1.52c gives an unresolved external when linking a DLL :-( */ | 570 | * Visual C 1.52c gives an unresolved external when linking a DLL :-( */ |
| 587 | static int get_ip(const char *str, unsigned char ip[4]) | 571 | static int |
| 588 | { | 572 | get_ip(const char *str, unsigned char ip[4]) |
| 573 | { | ||
| 589 | unsigned int tmp[4]; | 574 | unsigned int tmp[4]; |
| 590 | int num=0,c,ok=0; | 575 | int num = 0, c, ok = 0; |
| 591 | 576 | ||
| 592 | tmp[0]=tmp[1]=tmp[2]=tmp[3]=0; | 577 | tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0; |
| 593 | 578 | ||
| 594 | for (;;) | 579 | for (;;) { |
| 595 | { | ||
| 596 | c= *(str++); | 580 | c= *(str++); |
| 597 | if ((c >= '0') && (c <= '9')) | 581 | if ((c >= '0') && (c <= '9')) { |
| 598 | { | 582 | ok = 1; |
| 599 | ok=1; | 583 | tmp[num] = tmp[num]*10 + c-'0'; |
| 600 | tmp[num]=tmp[num]*10+c-'0'; | 584 | if (tmp[num] > 255) |
| 601 | if (tmp[num] > 255) return(0); | 585 | return (0); |
| 602 | } | 586 | } else if (c == '.') { |
| 603 | else if (c == '.') | 587 | if (!ok) |
| 604 | { | 588 | return (-1); |
| 605 | if (!ok) return(-1); | 589 | if (num == 3) |
| 606 | if (num == 3) return(0); | 590 | return (0); |
| 607 | num++; | 591 | num++; |
| 608 | ok=0; | 592 | ok = 0; |
| 609 | } | 593 | } else if (c == '\0' && (num == 3) && ok) |
| 610 | else if (c == '\0' && (num == 3) && ok) | 594 | break; |
| 611 | break; | ||
| 612 | else | 595 | else |
| 613 | return(0); | 596 | return (0); |
| 614 | } | ||
| 615 | ip[0]=tmp[0]; | ||
| 616 | ip[1]=tmp[1]; | ||
| 617 | ip[2]=tmp[2]; | ||
| 618 | ip[3]=tmp[3]; | ||
| 619 | return(1); | ||
| 620 | } | 597 | } |
| 621 | 598 | ip[0] = tmp[0]; | |
| 622 | int BIO_get_accept_socket(char *host, int bind_mode) | 599 | ip[1] = tmp[1]; |
| 623 | { | 600 | ip[2] = tmp[2]; |
| 624 | int ret=0; | 601 | ip[3] = tmp[3]; |
| 602 | return (1); | ||
| 603 | } | ||
| 604 | |||
| 605 | int | ||
| 606 | BIO_get_accept_socket(char *host, int bind_mode) | ||
| 607 | { | ||
| 608 | int ret = 0; | ||
| 625 | union { | 609 | union { |
| 626 | struct sockaddr sa; | 610 | struct sockaddr sa; |
| 627 | struct sockaddr_in sa_in; | 611 | struct sockaddr_in sa_in; |
| 628 | #if OPENSSL_USE_IPV6 | 612 | #if OPENSSL_USE_IPV6 |
| 629 | struct sockaddr_in6 sa_in6; | 613 | struct sockaddr_in6 sa_in6; |
| 630 | #endif | 614 | #endif |
| 631 | } server,client; | 615 | } server, client; |
| 632 | int s=-1,cs,addrlen; | 616 | int s = -1, cs, addrlen; |
| 633 | unsigned char ip[4]; | 617 | unsigned char ip[4]; |
| 634 | unsigned short port; | 618 | unsigned short port; |
| 635 | char *str=NULL,*e; | 619 | char *str = NULL, *e; |
| 636 | char *h,*p; | 620 | char *h, *p; |
| 637 | unsigned long l; | 621 | unsigned long l; |
| 638 | int err_num; | 622 | int err_num; |
| 639 | 623 | ||
| 640 | if (BIO_sock_init() != 1) return(-1); | 624 | if (BIO_sock_init() != 1) |
| 625 | return (-1); | ||
| 641 | 626 | ||
| 642 | if ((str=BUF_strdup(host)) == NULL) return(-1); | 627 | if ((str = BUF_strdup(host)) == NULL) |
| 628 | return (-1); | ||
| 643 | 629 | ||
| 644 | h=p=NULL; | 630 | h = p = NULL; |
| 645 | h=str; | 631 | h = str; |
| 646 | for (e=str; *e; e++) | 632 | for (e = str; *e; e++) { |
| 647 | { | 633 | if (*e == ':') { |
| 648 | if (*e == ':') | 634 | p = e; |
| 649 | { | 635 | } else if (*e == '/') { |
| 650 | p=e; | 636 | *e = '\0'; |
| 651 | } | ||
| 652 | else if (*e == '/') | ||
| 653 | { | ||
| 654 | *e='\0'; | ||
| 655 | break; | 637 | break; |
| 656 | } | ||
| 657 | } | 638 | } |
| 658 | if (p) *p++='\0'; /* points at last ':', '::port' is special [see below] */ | 639 | } |
| 659 | else p=h,h=NULL; | 640 | if (p) |
| 641 | *p++='\0'; /* points at last ':', '::port' is special [see below] */ | ||
| 642 | else | ||
| 643 | p = h, h = NULL; | ||
| 660 | 644 | ||
| 661 | #ifdef EAI_FAMILY | 645 | #ifdef EAI_FAMILY |
| 662 | do { | 646 | do { |
| 663 | static union { void *p; | 647 | static union { |
| 664 | int (WSAAPI *f)(const char *,const char *, | 648 | void *p; |
| 665 | const struct addrinfo *, | 649 | int (WSAAPI *f)(const char *, const char *, |
| 666 | struct addrinfo **); | 650 | const struct addrinfo *, |
| 667 | } p_getaddrinfo = {NULL}; | 651 | struct addrinfo **); |
| 668 | static union { void *p; | 652 | } p_getaddrinfo = {NULL}; |
| 653 | static union { | ||
| 654 | void *p; | ||
| 669 | void (WSAAPI *f)(struct addrinfo *); | 655 | void (WSAAPI *f)(struct addrinfo *); |
| 670 | } p_freeaddrinfo = {NULL}; | 656 | } p_freeaddrinfo = {NULL}; |
| 671 | struct addrinfo *res,hint; | 657 | struct addrinfo *res, hint; |
| 672 | 658 | ||
| 673 | if (p_getaddrinfo.p==NULL) | 659 | if (p_getaddrinfo.p == NULL) { |
| 674 | { | 660 | if ((p_getaddrinfo.p = DSO_global_lookup("getaddrinfo"))==NULL || |
| 675 | if ((p_getaddrinfo.p=DSO_global_lookup("getaddrinfo"))==NULL || | 661 | (p_freeaddrinfo.p = DSO_global_lookup("freeaddrinfo"))==NULL) |
| 676 | (p_freeaddrinfo.p=DSO_global_lookup("freeaddrinfo"))==NULL) | 662 | p_getaddrinfo.p = (void*) - 1; |
| 677 | p_getaddrinfo.p=(void*)-1; | 663 | } |
| 678 | } | 664 | if (p_getaddrinfo.p == (void *) - 1) break; |
| 679 | if (p_getaddrinfo.p==(void *)-1) break; | 665 | |
| 680 | 666 | /* '::port' enforces IPv6 wildcard listener. Some OSes, | |
| 681 | /* '::port' enforces IPv6 wildcard listener. Some OSes, | 667 | * e.g. Solaris, default to IPv6 without any hint. Also |
| 682 | * e.g. Solaris, default to IPv6 without any hint. Also | 668 | * note that commonly IPv6 wildchard socket can service |
| 683 | * note that commonly IPv6 wildchard socket can service | 669 | * IPv4 connections just as well... */ |
| 684 | * IPv4 connections just as well... */ | 670 | memset(&hint, 0, sizeof(hint)); |
| 685 | memset(&hint,0,sizeof(hint)); | 671 | hint.ai_flags = AI_PASSIVE; |
| 686 | hint.ai_flags = AI_PASSIVE; | 672 | if (h) { |
| 687 | if (h) | 673 | if (strchr(h, ':')) { |
| 688 | { | 674 | if (h[1] == '\0') |
| 689 | if (strchr(h,':')) | 675 | h = NULL; |
| 690 | { | ||
| 691 | if (h[1]=='\0') h=NULL; | ||
| 692 | #if OPENSSL_USE_IPV6 | 676 | #if OPENSSL_USE_IPV6 |
| 693 | hint.ai_family = AF_INET6; | 677 | hint.ai_family = AF_INET6; |
| 694 | #else | 678 | #else |
| 695 | h=NULL; | 679 | h = NULL; |
| 696 | #endif | 680 | #endif |
| 697 | } | 681 | } else if (h[0] == '*' && h[1] == '\0') { |
| 698 | else if (h[0]=='*' && h[1]=='\0') | 682 | hint.ai_family = AF_INET; |
| 699 | { | 683 | h = NULL; |
| 700 | hint.ai_family = AF_INET; | ||
| 701 | h=NULL; | ||
| 702 | } | 684 | } |
| 703 | } | 685 | } |
| 704 | 686 | ||
| 705 | if ((*p_getaddrinfo.f)(h,p,&hint,&res)) break; | 687 | if ((*p_getaddrinfo.f)(h, p, &hint, &res)) |
| 688 | break; | ||
| 706 | 689 | ||
| 707 | addrlen = res->ai_addrlen<=sizeof(server) ? | 690 | addrlen = res->ai_addrlen <= sizeof(server) ? |
| 708 | res->ai_addrlen : | 691 | res->ai_addrlen : sizeof(server); |
| 709 | sizeof(server); | 692 | memcpy(&server, res->ai_addr, addrlen); |
| 710 | memcpy(&server, res->ai_addr, addrlen); | ||
| 711 | 693 | ||
| 712 | (*p_freeaddrinfo.f)(res); | 694 | (*p_freeaddrinfo.f)(res); |
| 713 | goto again; | 695 | goto again; |
| 714 | } while (0); | 696 | } while (0); |
| 715 | #endif | 697 | #endif |
| 716 | 698 | ||
| 717 | if (!BIO_get_port(p,&port)) goto err; | 699 | if (!BIO_get_port(p, &port)) |
| 700 | goto err; | ||
| 718 | 701 | ||
| 719 | memset((char *)&server,0,sizeof(server)); | 702 | memset((char *)&server, 0, sizeof(server)); |
| 720 | server.sa_in.sin_family=AF_INET; | 703 | server.sa_in.sin_family = AF_INET; |
| 721 | server.sa_in.sin_port=htons(port); | 704 | server.sa_in.sin_port = htons(port); |
| 722 | addrlen = sizeof(server.sa_in); | 705 | addrlen = sizeof(server.sa_in); |
| 723 | 706 | ||
| 724 | if (h == NULL || strcmp(h,"*") == 0) | 707 | if (h == NULL || strcmp(h, "*") == 0) |
| 725 | server.sa_in.sin_addr.s_addr=INADDR_ANY; | 708 | server.sa_in.sin_addr.s_addr = INADDR_ANY; |
| 726 | else | 709 | else { |
| 727 | { | 710 | if (!BIO_get_host_ip(h, &(ip[0]))) |
| 728 | if (!BIO_get_host_ip(h,&(ip[0]))) goto err; | 711 | goto err; |
| 729 | l=(unsigned long) | 712 | l = (unsigned long) |
| 730 | ((unsigned long)ip[0]<<24L)| | 713 | ((unsigned long)ip[0]<<24L)| |
| 731 | ((unsigned long)ip[1]<<16L)| | 714 | ((unsigned long)ip[1]<<16L)| |
| 732 | ((unsigned long)ip[2]<< 8L)| | 715 | ((unsigned long)ip[2]<< 8L)| |
| 733 | ((unsigned long)ip[3]); | 716 | ((unsigned long)ip[3]); |
| 734 | server.sa_in.sin_addr.s_addr=htonl(l); | 717 | server.sa_in.sin_addr.s_addr = htonl(l); |
| 735 | } | 718 | } |
| 736 | 719 | ||
| 737 | again: | 720 | again: |
| 738 | s=socket(server.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL); | 721 | s = socket(server.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL); |
| 739 | if (s == -1) | 722 | if (s == -1) { |
| 740 | { | 723 | SYSerr(SYS_F_SOCKET, errno); |
| 741 | SYSerr(SYS_F_SOCKET,errno); | 724 | ERR_add_error_data(3, "port = '", host, "'"); |
| 742 | ERR_add_error_data(3,"port='",host,"'"); | 725 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_CREATE_SOCKET); |
| 743 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET); | ||
| 744 | goto err; | 726 | goto err; |
| 745 | } | 727 | } |
| 746 | 728 | ||
| 747 | #ifdef SO_REUSEADDR | 729 | #ifdef SO_REUSEADDR |
| 748 | if (bind_mode == BIO_BIND_REUSEADDR) | 730 | if (bind_mode == BIO_BIND_REUSEADDR) { |
| 749 | { | 731 | int i = 1; |
| 750 | int i=1; | ||
| 751 | 732 | ||
| 752 | ret=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i)); | 733 | ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR,(char *)&i, sizeof(i)); |
| 753 | bind_mode=BIO_BIND_NORMAL; | 734 | bind_mode = BIO_BIND_NORMAL; |
| 754 | } | 735 | } |
| 755 | #endif | 736 | #endif |
| 756 | if (bind(s,&server.sa,addrlen) == -1) | 737 | if (bind(s, &server.sa, addrlen) == -1) { |
| 757 | { | ||
| 758 | #ifdef SO_REUSEADDR | 738 | #ifdef SO_REUSEADDR |
| 759 | err_num=errno; | 739 | err_num = errno; |
| 760 | if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) && | 740 | if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) && |
| 761 | #ifdef OPENSSL_SYS_WINDOWS | 741 | #ifdef OPENSSL_SYS_WINDOWS |
| 762 | /* Some versions of Windows define EADDRINUSE to | 742 | /* Some versions of Windows define EADDRINUSE to |
| 763 | * a dummy value. | 743 | * a dummy value. |
| 764 | */ | 744 | */ |
| 765 | (err_num == WSAEADDRINUSE)) | 745 | (err_num == WSAEADDRINUSE)) |
| 766 | #else | 746 | #else |
| 767 | (err_num == EADDRINUSE)) | 747 | (err_num == EADDRINUSE)) |
| 768 | #endif | 748 | #endif |
| 769 | { | 749 | { |
| 770 | client = server; | 750 | client = server; |
| 771 | if (h == NULL || strcmp(h,"*") == 0) | 751 | if (h == NULL || strcmp(h, "*") == 0) { |
| 772 | { | ||
| 773 | #if OPENSSL_USE_IPV6 | 752 | #if OPENSSL_USE_IPV6 |
| 774 | if (client.sa.sa_family == AF_INET6) | 753 | if (client.sa.sa_family == AF_INET6) { |
| 775 | { | 754 | memset(&client.sa_in6.sin6_addr, 0, sizeof(client.sa_in6.sin6_addr)); |
| 776 | memset(&client.sa_in6.sin6_addr,0,sizeof(client.sa_in6.sin6_addr)); | 755 | client.sa_in6.sin6_addr.s6_addr[15] = 1; |
| 777 | client.sa_in6.sin6_addr.s6_addr[15]=1; | 756 | } else |
| 778 | } | 757 | #endif |
| 779 | else | 758 | if (client.sa.sa_family == AF_INET) { |
| 780 | #endif | 759 | client.sa_in.sin_addr.s_addr = htonl(0x7F000001); |
| 781 | if (client.sa.sa_family == AF_INET) | 760 | } else |
| 782 | { | 761 | goto err; |
| 783 | client.sa_in.sin_addr.s_addr=htonl(0x7F000001); | 762 | } |
| 784 | } | 763 | cs = socket(client.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL); |
| 785 | else goto err; | 764 | if (cs != -1) { |
| 786 | } | ||
| 787 | cs=socket(client.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL); | ||
| 788 | if (cs != -1) | ||
| 789 | { | ||
| 790 | int ii; | 765 | int ii; |
| 791 | ii=connect(cs,&client.sa,addrlen); | 766 | ii = connect(cs, &client.sa, addrlen); |
| 792 | close(cs); | 767 | close(cs); |
| 793 | if (ii == -1) | 768 | if (ii == -1) { |
| 794 | { | 769 | bind_mode = BIO_BIND_REUSEADDR; |
| 795 | bind_mode=BIO_BIND_REUSEADDR; | ||
| 796 | close(s); | 770 | close(s); |
| 797 | goto again; | 771 | goto again; |
| 798 | } | ||
| 799 | /* else error */ | ||
| 800 | } | 772 | } |
| 801 | /* else error */ | 773 | /* else error */ |
| 802 | } | 774 | } |
| 775 | /* else error */ | ||
| 776 | } | ||
| 803 | #endif | 777 | #endif |
| 804 | SYSerr(SYS_F_BIND,err_num); | 778 | SYSerr(SYS_F_BIND, err_num); |
| 805 | ERR_add_error_data(3,"port='",host,"'"); | 779 | ERR_add_error_data(3, "port = '", host, "'"); |
| 806 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET); | 780 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_BIND_SOCKET); |
| 807 | goto err; | 781 | goto err; |
| 808 | } | 782 | } |
| 809 | if (listen(s,MAX_LISTEN) == -1) | 783 | if (listen(s, MAX_LISTEN) == -1) { |
| 810 | { | 784 | SYSerr(SYS_F_BIND, errno); |
| 811 | SYSerr(SYS_F_BIND,errno); | 785 | ERR_add_error_data(3, "port = '", host, "'"); |
| 812 | ERR_add_error_data(3,"port='",host,"'"); | 786 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_LISTEN_SOCKET); |
| 813 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_LISTEN_SOCKET); | ||
| 814 | goto err; | 787 | goto err; |
| 815 | } | 788 | } |
| 816 | ret=1; | 789 | ret = 1; |
| 817 | err: | 790 | err: |
| 818 | if (str != NULL) OPENSSL_free(str); | 791 | if (str != NULL) |
| 819 | if ((ret == 0) && (s != -1)) | 792 | OPENSSL_free(str); |
| 820 | { | 793 | if ((ret == 0) && (s != -1)) { |
| 821 | close(s); | 794 | close(s); |
| 822 | s= -1; | 795 | s = -1; |
| 823 | } | ||
| 824 | return(s); | ||
| 825 | } | 796 | } |
| 797 | return (s); | ||
| 798 | } | ||
| 826 | 799 | ||
| 827 | int BIO_accept(int sock, char **addr) | 800 | int |
| 828 | { | 801 | BIO_accept(int sock, char **addr) |
| 829 | int ret=-1; | 802 | { |
| 803 | int ret = -1; | ||
| 830 | unsigned long l; | 804 | unsigned long l; |
| 831 | unsigned short port; | 805 | unsigned short port; |
| 832 | char *p; | 806 | char *p; |
| 833 | 807 | ||
| 834 | struct { | 808 | struct { |
| 835 | /* | 809 | /* |
| 836 | * As for following union. Trouble is that there are platforms | 810 | * As for following union. Trouble is that there are platforms |
| 837 | * that have socklen_t and there are platforms that don't, on | 811 | * that have socklen_t and there are platforms that don't, on |
| 838 | * some platforms socklen_t is int and on some size_t. So what | 812 | * some platforms socklen_t is int and on some size_t. So what |
| 839 | * one can do? One can cook #ifdef spaghetti, which is nothing | 813 | * one can do? One can cook #ifdef spaghetti, which is nothing |
| 840 | * but masochistic. Or one can do union between int and size_t. | 814 | * but masochistic. Or one can do union between int and size_t. |
| 841 | * One naturally does it primarily for 64-bit platforms where | 815 | * One naturally does it primarily for 64-bit platforms where |
| 842 | * sizeof(int) != sizeof(size_t). But would it work? Note that | 816 | * sizeof(int) != sizeof(size_t). But would it work? Note that |
| 843 | * if size_t member is initialized to 0, then later int member | 817 | * if size_t member is initialized to 0, then later int member |
| 844 | * assignment naturally does the job on little-endian platforms | 818 | * assignment naturally does the job on little-endian platforms |
| 845 | * regardless accept's expectations! What about big-endians? | 819 | * regardless accept's expectations! What about big-endians? |
| 846 | * If accept expects int*, then it works, and if size_t*, then | 820 | * If accept expects int*, then it works, and if size_t*, then |
| 847 | * length value would appear as unreasonably large. But this | 821 | * length value would appear as unreasonably large. But this |
| 848 | * won't prevent it from filling in the address structure. The | 822 | * won't prevent it from filling in the address structure. The |
| 849 | * trouble of course would be if accept returns more data than | 823 | * trouble of course would be if accept returns more data than |
| 850 | * actual buffer can accomodate and overwrite stack... That's | 824 | * actual buffer can accomodate and overwrite stack... That's |
| 851 | * where early OPENSSL_assert comes into picture. Besides, the | 825 | * where early OPENSSL_assert comes into picture. Besides, the |
| 852 | * only 64-bit big-endian platform found so far that expects | 826 | * only 64-bit big-endian platform found so far that expects |
| 853 | * size_t* is HP-UX, where stack grows towards higher address. | 827 | * size_t* is HP-UX, where stack grows towards higher address. |
| 854 | * <appro> | 828 | * <appro> |
| 855 | */ | 829 | */ |
| 856 | union { size_t s; int i; } len; | 830 | union { |
| 857 | union { | 831 | size_t s; |
| 858 | struct sockaddr sa; | 832 | int i; |
| 859 | struct sockaddr_in sa_in; | 833 | } len; |
| 834 | union { | ||
| 835 | struct sockaddr sa; | ||
| 836 | struct sockaddr_in sa_in; | ||
| 860 | #if OPENSSL_USE_IPV6 | 837 | #if OPENSSL_USE_IPV6 |
| 861 | struct sockaddr_in6 sa_in6; | 838 | struct sockaddr_in6 sa_in6; |
| 862 | #endif | 839 | #endif |
| 863 | } from; | 840 | } from; |
| 864 | } sa; | 841 | } sa; |
| 865 | 842 | ||
| 866 | sa.len.s=0; | 843 | sa.len.s = 0; |
| 867 | sa.len.i=sizeof(sa.from); | 844 | sa.len.i = sizeof(sa.from); |
| 868 | memset(&sa.from,0,sizeof(sa.from)); | 845 | memset(&sa.from, 0, sizeof(sa.from)); |
| 869 | ret=accept(sock,&sa.from.sa,(void *)&sa.len); | 846 | ret = accept(sock, &sa.from.sa,(void *)&sa.len); |
| 870 | if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0) | 847 | if (sizeof(sa.len.i) != sizeof(sa.len.s) && sa.len.i == 0) { |
| 871 | { | 848 | OPENSSL_assert(sa.len.s <= sizeof(sa.from)); |
| 872 | OPENSSL_assert(sa.len.s<=sizeof(sa.from)); | ||
| 873 | sa.len.i = (int)sa.len.s; | 849 | sa.len.i = (int)sa.len.s; |
| 874 | /* use sa.len.i from this point */ | 850 | /* use sa.len.i from this point */ |
| 875 | } | 851 | } |
| 876 | if (ret == -1) | 852 | if (ret == -1) { |
| 877 | { | 853 | if (BIO_sock_should_retry(ret)) return -2; |
| 878 | if(BIO_sock_should_retry(ret)) return -2; | 854 | SYSerr(SYS_F_ACCEPT, errno); |
| 879 | SYSerr(SYS_F_ACCEPT,errno); | 855 | BIOerr(BIO_F_BIO_ACCEPT, BIO_R_ACCEPT_ERROR); |
| 880 | BIOerr(BIO_F_BIO_ACCEPT,BIO_R_ACCEPT_ERROR); | ||
| 881 | goto end; | 856 | goto end; |
| 882 | } | 857 | } |
| 883 | 858 | ||
| 884 | if (addr == NULL) goto end; | 859 | if (addr == NULL) |
| 860 | goto end; | ||
| 885 | 861 | ||
| 886 | #ifdef EAI_FAMILY | 862 | #ifdef EAI_FAMILY |
| 887 | do { | 863 | do { |
| 888 | char h[NI_MAXHOST],s[NI_MAXSERV]; | 864 | char h[NI_MAXHOST], s[NI_MAXSERV]; |
| 889 | size_t nl; | 865 | size_t nl; |
| 890 | static union { void *p; | 866 | static union { |
| 891 | int (WSAAPI *f)(const struct sockaddr *,size_t/*socklen_t*/, | 867 | void *p; |
| 892 | char *,size_t,char *,size_t,int); | 868 | int (WSAAPI *f)(const struct sockaddr *, |
| 893 | } p_getnameinfo = {NULL}; | 869 | size_t/*socklen_t*/, char *, size_t, |
| 894 | /* 2nd argument to getnameinfo is specified to | 870 | char *, size_t, int); |
| 895 | * be socklen_t. Unfortunately there is a number | 871 | } p_getnameinfo = {NULL}; |
| 896 | * of environments where socklen_t is not defined. | 872 | /* 2nd argument to getnameinfo is specified to |
| 897 | * As it's passed by value, it's safe to pass it | 873 | * be socklen_t. Unfortunately there is a number |
| 898 | * as size_t... <appro> */ | 874 | * of environments where socklen_t is not defined. |
| 899 | 875 | * As it's passed by value, it's safe to pass it | |
| 900 | if (p_getnameinfo.p==NULL) | 876 | * as size_t... <appro> */ |
| 901 | { | 877 | |
| 902 | if ((p_getnameinfo.p=DSO_global_lookup("getnameinfo"))==NULL) | 878 | if (p_getnameinfo.p == NULL) { |
| 903 | p_getnameinfo.p=(void*)-1; | 879 | if ((p_getnameinfo.p = DSO_global_lookup("getnameinfo")) == NULL) |
| 880 | p_getnameinfo.p = (void*) - 1; | ||
| 881 | } | ||
| 882 | if (p_getnameinfo.p == (void *) - 1) | ||
| 883 | break; | ||
| 884 | |||
| 885 | if ((*p_getnameinfo.f)(&sa.from.sa, sa.len.i, h, sizeof(h), | ||
| 886 | s, sizeof(s), NI_NUMERICHOST|NI_NUMERICSERV)) | ||
| 887 | break; | ||
| 888 | nl = strlen(h) + strlen(s) + 2; | ||
| 889 | p = *addr; | ||
| 890 | if (p) { | ||
| 891 | *p = '\0'; | ||
| 892 | p = OPENSSL_realloc(p, nl); | ||
| 893 | } else { | ||
| 894 | p = OPENSSL_malloc(nl); | ||
| 895 | } | ||
| 896 | if (p == NULL) { | ||
| 897 | BIOerr(BIO_F_BIO_ACCEPT, ERR_R_MALLOC_FAILURE); | ||
| 898 | goto end; | ||
| 904 | } | 899 | } |
| 905 | if (p_getnameinfo.p==(void *)-1) break; | 900 | *addr = p; |
| 906 | 901 | (void) snprintf(*addr, nl, "%s:%s", h, s); | |
| 907 | if ((*p_getnameinfo.f)(&sa.from.sa,sa.len.i,h,sizeof(h),s,sizeof(s), | ||
| 908 | NI_NUMERICHOST|NI_NUMERICSERV)) break; | ||
| 909 | nl = strlen(h)+strlen(s)+2; | ||
| 910 | p = *addr; | ||
| 911 | if (p) { *p = '\0'; p = OPENSSL_realloc(p,nl); } | ||
| 912 | else { p = OPENSSL_malloc(nl); } | ||
| 913 | if (p==NULL) | ||
| 914 | { | ||
| 915 | BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE); | ||
| 916 | goto end; | 902 | goto end; |
| 917 | } | 903 | } while (0); |
| 918 | *addr = p; | 904 | #endif |
| 919 | (void) snprintf(*addr,nl,"%s:%s",h,s); | 905 | if (sa.from.sa.sa_family != AF_INET) |
| 920 | goto end; | 906 | goto end; |
| 921 | } while(0); | 907 | l = ntohl(sa.from.sa_in.sin_addr.s_addr); |
| 922 | #endif | 908 | port = ntohs(sa.from.sa_in.sin_port); |
| 923 | if (sa.from.sa.sa_family != AF_INET) goto end; | 909 | if (*addr == NULL) { |
| 924 | l=ntohl(sa.from.sa_in.sin_addr.s_addr); | 910 | if ((p = OPENSSL_malloc(24)) == NULL) { |
| 925 | port=ntohs(sa.from.sa_in.sin_port); | 911 | BIOerr(BIO_F_BIO_ACCEPT, ERR_R_MALLOC_FAILURE); |
| 926 | if (*addr == NULL) | ||
| 927 | { | ||
| 928 | if ((p=OPENSSL_malloc(24)) == NULL) | ||
| 929 | { | ||
| 930 | BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE); | ||
| 931 | goto end; | 912 | goto end; |
| 932 | } | ||
| 933 | *addr=p; | ||
| 934 | } | 913 | } |
| 935 | (void) snprintf(*addr,24,"%d.%d.%d.%d:%d", | 914 | *addr = p; |
| 936 | (unsigned char)(l>>24L)&0xff, | ||
| 937 | (unsigned char)(l>>16L)&0xff, | ||
| 938 | (unsigned char)(l>> 8L)&0xff, | ||
| 939 | (unsigned char)(l )&0xff, | ||
| 940 | port); | ||
| 941 | end: | ||
| 942 | return(ret); | ||
| 943 | } | 915 | } |
| 916 | (void) snprintf(*addr, 24, "%d.%d.%d.%d:%d", | ||
| 917 | (unsigned char)(l >> 24L) & 0xff, (unsigned char)(l >> 16L) & 0xff, | ||
| 918 | (unsigned char)(l >> 8L) & 0xff, (unsigned char)(l) & 0xff, port); | ||
| 944 | 919 | ||
| 945 | int BIO_set_tcp_ndelay(int s, int on) | 920 | end: |
| 946 | { | 921 | return (ret); |
| 947 | int ret=0; | 922 | } |
| 923 | |||
| 924 | int | ||
| 925 | BIO_set_tcp_ndelay(int s, int on) | ||
| 926 | { | ||
| 927 | int ret = 0; | ||
| 948 | #if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP)) | 928 | #if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP)) |
| 949 | int opt; | 929 | int opt; |
| 950 | 930 | ||
| 951 | #ifdef SOL_TCP | 931 | #ifdef SOL_TCP |
| 952 | opt=SOL_TCP; | 932 | opt = SOL_TCP; |
| 953 | #else | 933 | #else |
| 954 | #ifdef IPPROTO_TCP | 934 | #ifdef IPPROTO_TCP |
| 955 | opt=IPPROTO_TCP; | 935 | opt = IPPROTO_TCP; |
| 956 | #endif | 936 | #endif |
| 957 | #endif | 937 | #endif |
| 958 | 938 | ||
| 959 | ret=setsockopt(s,opt,TCP_NODELAY,(char *)&on,sizeof(on)); | 939 | ret = setsockopt(s, opt, TCP_NODELAY,(char *)&on, sizeof(on)); |
| 960 | #endif | 940 | #endif |
| 961 | return(ret == 0); | 941 | return (ret == 0); |
| 962 | } | 942 | } |
| 963 | 943 | ||
| 964 | int BIO_socket_nbio(int s, int mode) | 944 | int |
| 965 | { | 945 | BIO_socket_nbio(int s, int mode) |
| 966 | int ret= -1; | 946 | { |
| 947 | int ret = -1; | ||
| 967 | int l; | 948 | int l; |
| 968 | 949 | ||
| 969 | l=mode; | 950 | l = mode; |
| 970 | #ifdef FIONBIO | 951 | #ifdef FIONBIO |
| 971 | ret=BIO_socket_ioctl(s,FIONBIO,&l); | 952 | ret = BIO_socket_ioctl(s, FIONBIO, &l); |
| 972 | #endif | 953 | #endif |
| 973 | return(ret == 0); | 954 | return (ret == 0); |
| 974 | } | 955 | } |
| 975 | #endif | 956 | #endif |
diff --git a/src/lib/libcrypto/bio/bf_buff.c b/src/lib/libcrypto/bio/bf_buff.c index 4b5a132d8a..9518cf977e 100644 --- a/src/lib/libcrypto/bio/bf_buff.c +++ b/src/lib/libcrypto/bio/bf_buff.c | |||
| @@ -61,7 +61,7 @@ | |||
| 61 | #include "cryptlib.h" | 61 | #include "cryptlib.h" |
| 62 | #include <openssl/bio.h> | 62 | #include <openssl/bio.h> |
| 63 | 63 | ||
| 64 | static int buffer_write(BIO *h, const char *buf,int num); | 64 | static int buffer_write(BIO *h, const char *buf, int num); |
| 65 | static int buffer_read(BIO *h, char *buf, int size); | 65 | static int buffer_read(BIO *h, char *buf, int size); |
| 66 | static int buffer_puts(BIO *h, const char *str); | 66 | static int buffer_puts(BIO *h, const char *str); |
| 67 | static int buffer_gets(BIO *h, char *str, int size); | 67 | static int buffer_gets(BIO *h, char *str, int size); |
| @@ -71,8 +71,7 @@ static int buffer_free(BIO *data); | |||
| 71 | static long buffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); | 71 | static long buffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); |
| 72 | #define DEFAULT_BUFFER_SIZE 4096 | 72 | #define DEFAULT_BUFFER_SIZE 4096 |
| 73 | 73 | ||
| 74 | static BIO_METHOD methods_buffer= | 74 | static BIO_METHOD methods_buffer = { |
| 75 | { | ||
| 76 | BIO_TYPE_BUFFER, | 75 | BIO_TYPE_BUFFER, |
| 77 | "buffer", | 76 | "buffer", |
| 78 | buffer_write, | 77 | buffer_write, |
| @@ -83,430 +82,444 @@ static BIO_METHOD methods_buffer= | |||
| 83 | buffer_new, | 82 | buffer_new, |
| 84 | buffer_free, | 83 | buffer_free, |
| 85 | buffer_callback_ctrl, | 84 | buffer_callback_ctrl, |
| 86 | }; | 85 | }; |
| 87 | 86 | ||
| 88 | BIO_METHOD *BIO_f_buffer(void) | 87 | BIO_METHOD |
| 89 | { | 88 | *BIO_f_buffer(void) |
| 90 | return(&methods_buffer); | 89 | { |
| 91 | } | 90 | return (&methods_buffer); |
| 91 | } | ||
| 92 | 92 | ||
| 93 | static int buffer_new(BIO *bi) | 93 | static int |
| 94 | { | 94 | buffer_new(BIO *bi) |
| 95 | { | ||
| 95 | BIO_F_BUFFER_CTX *ctx; | 96 | BIO_F_BUFFER_CTX *ctx; |
| 96 | 97 | ||
| 97 | ctx=(BIO_F_BUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_F_BUFFER_CTX)); | 98 | ctx = (BIO_F_BUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_F_BUFFER_CTX)); |
| 98 | if (ctx == NULL) return(0); | 99 | if (ctx == NULL) |
| 99 | ctx->ibuf=(char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); | 100 | return (0); |
| 100 | if (ctx->ibuf == NULL) { OPENSSL_free(ctx); return(0); } | 101 | ctx->ibuf = (char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); |
| 101 | ctx->obuf=(char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); | 102 | if (ctx->ibuf == NULL) { |
| 102 | if (ctx->obuf == NULL) { OPENSSL_free(ctx->ibuf); OPENSSL_free(ctx); return(0); } | 103 | OPENSSL_free(ctx); |
| 103 | ctx->ibuf_size=DEFAULT_BUFFER_SIZE; | 104 | return (0); |
| 104 | ctx->obuf_size=DEFAULT_BUFFER_SIZE; | ||
| 105 | ctx->ibuf_len=0; | ||
| 106 | ctx->ibuf_off=0; | ||
| 107 | ctx->obuf_len=0; | ||
| 108 | ctx->obuf_off=0; | ||
| 109 | |||
| 110 | bi->init=1; | ||
| 111 | bi->ptr=(char *)ctx; | ||
| 112 | bi->flags=0; | ||
| 113 | return(1); | ||
| 114 | } | 105 | } |
| 115 | 106 | ctx->obuf = (char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); | |
| 116 | static int buffer_free(BIO *a) | 107 | if (ctx->obuf == NULL) { |
| 117 | { | 108 | OPENSSL_free(ctx->ibuf); |
| 109 | OPENSSL_free(ctx); | ||
| 110 | return (0); | ||
| 111 | } | ||
| 112 | ctx->ibuf_size = DEFAULT_BUFFER_SIZE; | ||
| 113 | ctx->obuf_size = DEFAULT_BUFFER_SIZE; | ||
| 114 | ctx->ibuf_len = 0; | ||
| 115 | ctx->ibuf_off = 0; | ||
| 116 | ctx->obuf_len = 0; | ||
| 117 | ctx->obuf_off = 0; | ||
| 118 | |||
| 119 | bi->init = 1; | ||
| 120 | bi->ptr = (char *)ctx; | ||
| 121 | bi->flags = 0; | ||
| 122 | return (1); | ||
| 123 | } | ||
| 124 | |||
| 125 | static int | ||
| 126 | buffer_free(BIO *a) | ||
| 127 | { | ||
| 118 | BIO_F_BUFFER_CTX *b; | 128 | BIO_F_BUFFER_CTX *b; |
| 119 | 129 | ||
| 120 | if (a == NULL) return(0); | 130 | if (a == NULL) |
| 121 | b=(BIO_F_BUFFER_CTX *)a->ptr; | 131 | return (0); |
| 122 | if (b->ibuf != NULL) OPENSSL_free(b->ibuf); | 132 | b = (BIO_F_BUFFER_CTX *)a->ptr; |
| 123 | if (b->obuf != NULL) OPENSSL_free(b->obuf); | 133 | if (b->ibuf != NULL) |
| 134 | OPENSSL_free(b->ibuf); | ||
| 135 | if (b->obuf != NULL) | ||
| 136 | OPENSSL_free(b->obuf); | ||
| 124 | OPENSSL_free(a->ptr); | 137 | OPENSSL_free(a->ptr); |
| 125 | a->ptr=NULL; | 138 | a->ptr = NULL; |
| 126 | a->init=0; | 139 | a->init = 0; |
| 127 | a->flags=0; | 140 | a->flags = 0; |
| 128 | return(1); | 141 | return (1); |
| 129 | } | 142 | } |
| 130 | 143 | ||
| 131 | static int buffer_read(BIO *b, char *out, int outl) | 144 | static int |
| 132 | { | 145 | buffer_read(BIO *b, char *out, int outl) |
| 133 | int i,num=0; | 146 | { |
| 147 | int i, num = 0; | ||
| 134 | BIO_F_BUFFER_CTX *ctx; | 148 | BIO_F_BUFFER_CTX *ctx; |
| 135 | 149 | ||
| 136 | if (out == NULL) return(0); | 150 | if (out == NULL) |
| 137 | ctx=(BIO_F_BUFFER_CTX *)b->ptr; | 151 | return (0); |
| 152 | ctx = (BIO_F_BUFFER_CTX *)b->ptr; | ||
| 138 | 153 | ||
| 139 | if ((ctx == NULL) || (b->next_bio == NULL)) return(0); | 154 | if ((ctx == NULL) || (b->next_bio == NULL)) |
| 140 | num=0; | 155 | return (0); |
| 156 | num = 0; | ||
| 141 | BIO_clear_retry_flags(b); | 157 | BIO_clear_retry_flags(b); |
| 142 | 158 | ||
| 143 | start: | 159 | start: |
| 144 | i=ctx->ibuf_len; | 160 | i = ctx->ibuf_len; |
| 145 | /* If there is stuff left over, grab it */ | 161 | /* If there is stuff left over, grab it */ |
| 146 | if (i != 0) | 162 | if (i != 0) { |
| 147 | { | 163 | if (i > outl) |
| 148 | if (i > outl) i=outl; | 164 | i = outl; |
| 149 | memcpy(out,&(ctx->ibuf[ctx->ibuf_off]),i); | 165 | memcpy(out, &(ctx->ibuf[ctx->ibuf_off]), i); |
| 150 | ctx->ibuf_off+=i; | 166 | ctx->ibuf_off += i; |
| 151 | ctx->ibuf_len-=i; | 167 | ctx->ibuf_len -= i; |
| 152 | num+=i; | 168 | num += i; |
| 153 | if (outl == i) return(num); | 169 | if (outl == i) |
| 154 | outl-=i; | 170 | return (num); |
| 155 | out+=i; | 171 | outl -= i; |
| 156 | } | 172 | out += i; |
| 173 | } | ||
| 157 | 174 | ||
| 158 | /* We may have done a partial read. try to do more. | 175 | /* We may have done a partial read. try to do more. |
| 159 | * We have nothing in the buffer. | 176 | * We have nothing in the buffer. |
| 160 | * If we get an error and have read some data, just return it | 177 | * If we get an error and have read some data, just return it |
| 161 | * and let them retry to get the error again. | 178 | * and let them retry to get the error again. |
| 162 | * copy direct to parent address space */ | 179 | * copy direct to parent address space */ |
| 163 | if (outl > ctx->ibuf_size) | 180 | if (outl > ctx->ibuf_size) { |
| 164 | { | 181 | for (;;) { |
| 165 | for (;;) | 182 | i = BIO_read(b->next_bio, out, outl); |
| 166 | { | 183 | if (i <= 0) { |
| 167 | i=BIO_read(b->next_bio,out,outl); | ||
| 168 | if (i <= 0) | ||
| 169 | { | ||
| 170 | BIO_copy_next_retry(b); | 184 | BIO_copy_next_retry(b); |
| 171 | if (i < 0) return((num > 0)?num:i); | 185 | if (i < 0) |
| 172 | if (i == 0) return(num); | 186 | return ((num > 0) ? num : i); |
| 173 | } | 187 | if (i == 0) |
| 174 | num+=i; | 188 | return (num); |
| 175 | if (outl == i) return(num); | ||
| 176 | out+=i; | ||
| 177 | outl-=i; | ||
| 178 | } | 189 | } |
| 190 | num += i; | ||
| 191 | if (outl == i) | ||
| 192 | return (num); | ||
| 193 | out += i; | ||
| 194 | outl -= i; | ||
| 179 | } | 195 | } |
| 196 | } | ||
| 180 | /* else */ | 197 | /* else */ |
| 181 | 198 | ||
| 182 | /* we are going to be doing some buffering */ | 199 | /* we are going to be doing some buffering */ |
| 183 | i=BIO_read(b->next_bio,ctx->ibuf,ctx->ibuf_size); | 200 | i = BIO_read(b->next_bio, ctx->ibuf, ctx->ibuf_size); |
| 184 | if (i <= 0) | 201 | if (i <= 0) { |
| 185 | { | ||
| 186 | BIO_copy_next_retry(b); | 202 | BIO_copy_next_retry(b); |
| 187 | if (i < 0) return((num > 0)?num:i); | 203 | if (i < 0) |
| 188 | if (i == 0) return(num); | 204 | return ((num > 0) ? num : i); |
| 189 | } | 205 | if (i == 0) |
| 190 | ctx->ibuf_off=0; | 206 | return (num); |
| 191 | ctx->ibuf_len=i; | 207 | } |
| 208 | ctx->ibuf_off = 0; | ||
| 209 | ctx->ibuf_len = i; | ||
| 192 | 210 | ||
| 193 | /* Lets re-read using ourselves :-) */ | 211 | /* Lets re-read using ourselves :-) */ |
| 194 | goto start; | 212 | goto start; |
| 195 | } | 213 | } |
| 196 | 214 | ||
| 197 | static int buffer_write(BIO *b, const char *in, int inl) | 215 | static int |
| 198 | { | 216 | buffer_write(BIO *b, const char *in, int inl) |
| 199 | int i,num=0; | 217 | { |
| 218 | int i, num = 0; | ||
| 200 | BIO_F_BUFFER_CTX *ctx; | 219 | BIO_F_BUFFER_CTX *ctx; |
| 201 | 220 | ||
| 202 | if ((in == NULL) || (inl <= 0)) return(0); | 221 | if ((in == NULL) || (inl <= 0)) |
| 203 | ctx=(BIO_F_BUFFER_CTX *)b->ptr; | 222 | return (0); |
| 204 | if ((ctx == NULL) || (b->next_bio == NULL)) return(0); | 223 | ctx = (BIO_F_BUFFER_CTX *)b->ptr; |
| 224 | if ((ctx == NULL) || (b->next_bio == NULL)) | ||
| 225 | return (0); | ||
| 205 | 226 | ||
| 206 | BIO_clear_retry_flags(b); | 227 | BIO_clear_retry_flags(b); |
| 207 | start: | 228 | start: |
| 208 | i=ctx->obuf_size-(ctx->obuf_len+ctx->obuf_off); | 229 | i = ctx->obuf_size - (ctx->obuf_len + ctx->obuf_off); |
| 209 | /* add to buffer and return */ | 230 | /* add to buffer and return */ |
| 210 | if (i >= inl) | 231 | if (i >= inl) { |
| 211 | { | 232 | memcpy(&(ctx->obuf[ctx->obuf_off + ctx->obuf_len]), in, inl); |
| 212 | memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,inl); | 233 | ctx->obuf_len += inl; |
| 213 | ctx->obuf_len+=inl; | 234 | return (num + inl); |
| 214 | return(num+inl); | 235 | } |
| 215 | } | ||
| 216 | /* else */ | 236 | /* else */ |
| 217 | /* stuff already in buffer, so add to it first, then flush */ | 237 | /* stuff already in buffer, so add to it first, then flush */ |
| 218 | if (ctx->obuf_len != 0) | 238 | if (ctx->obuf_len != 0) { |
| 219 | { | ||
| 220 | if (i > 0) /* lets fill it up if we can */ | 239 | if (i > 0) /* lets fill it up if we can */ |
| 221 | { | 240 | { |
| 222 | memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,i); | 241 | memcpy(&(ctx->obuf[ctx->obuf_off + ctx->obuf_len]), in, i); |
| 223 | in+=i; | 242 | in += i; |
| 224 | inl-=i; | 243 | inl -= i; |
| 225 | num+=i; | 244 | num += i; |
| 226 | ctx->obuf_len+=i; | 245 | ctx->obuf_len += i; |
| 227 | } | 246 | } |
| 228 | /* we now have a full buffer needing flushing */ | 247 | /* we now have a full buffer needing flushing */ |
| 229 | for (;;) | 248 | for (;;) { |
| 230 | { | 249 | i = BIO_write(b->next_bio, &(ctx->obuf[ctx->obuf_off]), |
| 231 | i=BIO_write(b->next_bio,&(ctx->obuf[ctx->obuf_off]), | 250 | ctx->obuf_len); |
| 232 | ctx->obuf_len); | 251 | if (i <= 0) { |
| 233 | if (i <= 0) | ||
| 234 | { | ||
| 235 | BIO_copy_next_retry(b); | 252 | BIO_copy_next_retry(b); |
| 236 | 253 | ||
| 237 | if (i < 0) return((num > 0)?num:i); | 254 | if (i < 0) |
| 238 | if (i == 0) return(num); | 255 | return ((num > 0) ? num : i); |
| 239 | } | 256 | if (i == 0) |
| 240 | ctx->obuf_off+=i; | 257 | return (num); |
| 241 | ctx->obuf_len-=i; | ||
| 242 | if (ctx->obuf_len == 0) break; | ||
| 243 | } | 258 | } |
| 259 | ctx->obuf_off += i; | ||
| 260 | ctx->obuf_len -= i; | ||
| 261 | if (ctx->obuf_len == 0) | ||
| 262 | break; | ||
| 244 | } | 263 | } |
| 264 | } | ||
| 245 | /* we only get here if the buffer has been flushed and we | 265 | /* we only get here if the buffer has been flushed and we |
| 246 | * still have stuff to write */ | 266 | * still have stuff to write */ |
| 247 | ctx->obuf_off=0; | 267 | ctx->obuf_off = 0; |
| 248 | 268 | ||
| 249 | /* we now have inl bytes to write */ | 269 | /* we now have inl bytes to write */ |
| 250 | while (inl >= ctx->obuf_size) | 270 | while (inl >= ctx->obuf_size) { |
| 251 | { | 271 | i = BIO_write(b->next_bio, in, inl); |
| 252 | i=BIO_write(b->next_bio,in,inl); | 272 | if (i <= 0) { |
| 253 | if (i <= 0) | ||
| 254 | { | ||
| 255 | BIO_copy_next_retry(b); | 273 | BIO_copy_next_retry(b); |
| 256 | if (i < 0) return((num > 0)?num:i); | 274 | if (i < 0) |
| 257 | if (i == 0) return(num); | 275 | return ((num > 0) ? num : i); |
| 258 | } | 276 | if (i == 0) |
| 259 | num+=i; | 277 | return (num); |
| 260 | in+=i; | ||
| 261 | inl-=i; | ||
| 262 | if (inl == 0) return(num); | ||
| 263 | } | 278 | } |
| 279 | num += i; | ||
| 280 | in += i; | ||
| 281 | inl -= i; | ||
| 282 | if (inl == 0) | ||
| 283 | return (num); | ||
| 284 | } | ||
| 264 | 285 | ||
| 265 | /* copy the rest into the buffer since we have only a small | 286 | /* copy the rest into the buffer since we have only a small |
| 266 | * amount left */ | 287 | * amount left */ |
| 267 | goto start; | 288 | goto start; |
| 268 | } | 289 | } |
| 269 | 290 | ||
| 270 | static long buffer_ctrl(BIO *b, int cmd, long num, void *ptr) | 291 | static long |
| 271 | { | 292 | buffer_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 293 | { | ||
| 272 | BIO *dbio; | 294 | BIO *dbio; |
| 273 | BIO_F_BUFFER_CTX *ctx; | 295 | BIO_F_BUFFER_CTX *ctx; |
| 274 | long ret=1; | 296 | long ret = 1; |
| 275 | char *p1,*p2; | 297 | char *p1, *p2; |
| 276 | int r,i,*ip; | 298 | int r, i, *ip; |
| 277 | int ibs,obs; | 299 | int ibs, obs; |
| 278 | 300 | ||
| 279 | ctx=(BIO_F_BUFFER_CTX *)b->ptr; | 301 | ctx = (BIO_F_BUFFER_CTX *)b->ptr; |
| 280 | 302 | ||
| 281 | switch (cmd) | 303 | switch (cmd) { |
| 282 | { | ||
| 283 | case BIO_CTRL_RESET: | 304 | case BIO_CTRL_RESET: |
| 284 | ctx->ibuf_off=0; | 305 | ctx->ibuf_off = 0; |
| 285 | ctx->ibuf_len=0; | 306 | ctx->ibuf_len = 0; |
| 286 | ctx->obuf_off=0; | 307 | ctx->obuf_off = 0; |
| 287 | ctx->obuf_len=0; | 308 | ctx->obuf_len = 0; |
| 288 | if (b->next_bio == NULL) return(0); | 309 | if (b->next_bio == NULL) |
| 289 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 310 | return (0); |
| 311 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); | ||
| 290 | break; | 312 | break; |
| 291 | case BIO_CTRL_INFO: | 313 | case BIO_CTRL_INFO: |
| 292 | ret=(long)ctx->obuf_len; | 314 | ret = (long)ctx->obuf_len; |
| 293 | break; | 315 | break; |
| 294 | case BIO_C_GET_BUFF_NUM_LINES: | 316 | case BIO_C_GET_BUFF_NUM_LINES: |
| 295 | ret=0; | 317 | ret = 0; |
| 296 | p1=ctx->ibuf; | 318 | p1 = ctx->ibuf; |
| 297 | for (i=0; i<ctx->ibuf_len; i++) | 319 | for (i = 0; i < ctx->ibuf_len; i++) { |
| 298 | { | 320 | if (p1[ctx->ibuf_off + i] == '\n') |
| 299 | if (p1[ctx->ibuf_off + i] == '\n') ret++; | 321 | ret++; |
| 300 | } | 322 | } |
| 301 | break; | 323 | break; |
| 302 | case BIO_CTRL_WPENDING: | 324 | case BIO_CTRL_WPENDING: |
| 303 | ret=(long)ctx->obuf_len; | 325 | ret = (long)ctx->obuf_len; |
| 304 | if (ret == 0) | 326 | if (ret == 0) { |
| 305 | { | 327 | if (b->next_bio == NULL) |
| 306 | if (b->next_bio == NULL) return(0); | 328 | return (0); |
| 307 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 329 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 308 | } | 330 | } |
| 309 | break; | 331 | break; |
| 310 | case BIO_CTRL_PENDING: | 332 | case BIO_CTRL_PENDING: |
| 311 | ret=(long)ctx->ibuf_len; | 333 | ret = (long)ctx->ibuf_len; |
| 312 | if (ret == 0) | 334 | if (ret == 0) { |
| 313 | { | 335 | if (b->next_bio == NULL) |
| 314 | if (b->next_bio == NULL) return(0); | 336 | return (0); |
| 315 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 337 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 316 | } | 338 | } |
| 317 | break; | 339 | break; |
| 318 | case BIO_C_SET_BUFF_READ_DATA: | 340 | case BIO_C_SET_BUFF_READ_DATA: |
| 319 | if (num > ctx->ibuf_size) | 341 | if (num > ctx->ibuf_size) { |
| 320 | { | 342 | p1 = OPENSSL_malloc((int)num); |
| 321 | p1=OPENSSL_malloc((int)num); | 343 | if (p1 == NULL) |
| 322 | if (p1 == NULL) goto malloc_error; | 344 | goto malloc_error; |
| 323 | if (ctx->ibuf != NULL) OPENSSL_free(ctx->ibuf); | 345 | if (ctx->ibuf != NULL) |
| 324 | ctx->ibuf=p1; | 346 | OPENSSL_free(ctx->ibuf); |
| 325 | } | 347 | ctx->ibuf = p1; |
| 326 | ctx->ibuf_off=0; | 348 | } |
| 327 | ctx->ibuf_len=(int)num; | 349 | ctx->ibuf_off = 0; |
| 328 | memcpy(ctx->ibuf,ptr,(int)num); | 350 | ctx->ibuf_len = (int)num; |
| 329 | ret=1; | 351 | memcpy(ctx->ibuf, ptr,(int)num); |
| 352 | ret = 1; | ||
| 330 | break; | 353 | break; |
| 331 | case BIO_C_SET_BUFF_SIZE: | 354 | case BIO_C_SET_BUFF_SIZE: |
| 332 | if (ptr != NULL) | 355 | if (ptr != NULL) { |
| 333 | { | 356 | ip = (int *)ptr; |
| 334 | ip=(int *)ptr; | 357 | if (*ip == 0) { |
| 335 | if (*ip == 0) | 358 | ibs = (int)num; |
| 336 | { | 359 | obs = ctx->obuf_size; |
| 337 | ibs=(int)num; | ||
| 338 | obs=ctx->obuf_size; | ||
| 339 | } | ||
| 340 | else /* if (*ip == 1) */ | ||
| 341 | { | ||
| 342 | ibs=ctx->ibuf_size; | ||
| 343 | obs=(int)num; | ||
| 344 | } | ||
| 345 | } | ||
| 346 | else | ||
| 347 | { | ||
| 348 | ibs=(int)num; | ||
| 349 | obs=(int)num; | ||
| 350 | } | 360 | } |
| 351 | p1=ctx->ibuf; | 361 | else /* if (*ip == 1) */ |
| 352 | p2=ctx->obuf; | ||
| 353 | if ((ibs > DEFAULT_BUFFER_SIZE) && (ibs != ctx->ibuf_size)) | ||
| 354 | { | 362 | { |
| 355 | p1=(char *)OPENSSL_malloc((int)num); | 363 | ibs = ctx->ibuf_size; |
| 356 | if (p1 == NULL) goto malloc_error; | 364 | obs = (int)num; |
| 357 | } | 365 | } |
| 358 | if ((obs > DEFAULT_BUFFER_SIZE) && (obs != ctx->obuf_size)) | 366 | } else { |
| 359 | { | 367 | ibs = (int)num; |
| 360 | p2=(char *)OPENSSL_malloc((int)num); | 368 | obs = (int)num; |
| 361 | if (p2 == NULL) | 369 | } |
| 362 | { | 370 | p1 = ctx->ibuf; |
| 363 | if (p1 != ctx->ibuf) OPENSSL_free(p1); | 371 | p2 = ctx->obuf; |
| 372 | if ((ibs > DEFAULT_BUFFER_SIZE) && (ibs != ctx->ibuf_size)) { | ||
| 373 | p1 = (char *)OPENSSL_malloc((int)num); | ||
| 374 | if (p1 == NULL) | ||
| 375 | goto malloc_error; | ||
| 376 | } | ||
| 377 | if ((obs > DEFAULT_BUFFER_SIZE) && (obs != ctx->obuf_size)) { | ||
| 378 | p2 = (char *)OPENSSL_malloc((int)num); | ||
| 379 | if (p2 == NULL) { | ||
| 380 | if (p1 != ctx->ibuf) | ||
| 381 | OPENSSL_free(p1); | ||
| 364 | goto malloc_error; | 382 | goto malloc_error; |
| 365 | } | ||
| 366 | } | 383 | } |
| 367 | if (ctx->ibuf != p1) | 384 | } |
| 368 | { | 385 | if (ctx->ibuf != p1) { |
| 369 | OPENSSL_free(ctx->ibuf); | 386 | OPENSSL_free(ctx->ibuf); |
| 370 | ctx->ibuf=p1; | 387 | ctx->ibuf = p1; |
| 371 | ctx->ibuf_off=0; | 388 | ctx->ibuf_off = 0; |
| 372 | ctx->ibuf_len=0; | 389 | ctx->ibuf_len = 0; |
| 373 | ctx->ibuf_size=ibs; | 390 | ctx->ibuf_size = ibs; |
| 374 | } | 391 | } |
| 375 | if (ctx->obuf != p2) | 392 | if (ctx->obuf != p2) { |
| 376 | { | ||
| 377 | OPENSSL_free(ctx->obuf); | 393 | OPENSSL_free(ctx->obuf); |
| 378 | ctx->obuf=p2; | 394 | ctx->obuf = p2; |
| 379 | ctx->obuf_off=0; | 395 | ctx->obuf_off = 0; |
| 380 | ctx->obuf_len=0; | 396 | ctx->obuf_len = 0; |
| 381 | ctx->obuf_size=obs; | 397 | ctx->obuf_size = obs; |
| 382 | } | 398 | } |
| 383 | break; | 399 | break; |
| 384 | case BIO_C_DO_STATE_MACHINE: | 400 | case BIO_C_DO_STATE_MACHINE: |
| 385 | if (b->next_bio == NULL) return(0); | 401 | if (b->next_bio == NULL) |
| 402 | return (0); | ||
| 386 | BIO_clear_retry_flags(b); | 403 | BIO_clear_retry_flags(b); |
| 387 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 404 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 388 | BIO_copy_next_retry(b); | 405 | BIO_copy_next_retry(b); |
| 389 | break; | 406 | break; |
| 390 | 407 | ||
| 391 | case BIO_CTRL_FLUSH: | 408 | case BIO_CTRL_FLUSH: |
| 392 | if (b->next_bio == NULL) return(0); | 409 | if (b->next_bio == NULL) |
| 393 | if (ctx->obuf_len <= 0) | 410 | return (0); |
| 394 | { | 411 | if (ctx->obuf_len <= 0) { |
| 395 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 412 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 396 | break; | 413 | break; |
| 397 | } | 414 | } |
| 398 | 415 | ||
| 399 | for (;;) | 416 | for (;;) { |
| 400 | { | ||
| 401 | BIO_clear_retry_flags(b); | 417 | BIO_clear_retry_flags(b); |
| 402 | if (ctx->obuf_len > 0) | 418 | if (ctx->obuf_len > 0) { |
| 403 | { | 419 | r = BIO_write(b->next_bio, |
| 404 | r=BIO_write(b->next_bio, | 420 | &(ctx->obuf[ctx->obuf_off]), |
| 405 | &(ctx->obuf[ctx->obuf_off]), | 421 | ctx->obuf_len); |
| 406 | ctx->obuf_len); | ||
| 407 | #if 0 | 422 | #if 0 |
| 408 | fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len,r); | 423 | fprintf(stderr, "FLUSH [%3d] %3d -> %3d\n", ctx->obuf_off, ctx->obuf_len, r); |
| 409 | #endif | 424 | #endif |
| 410 | BIO_copy_next_retry(b); | 425 | BIO_copy_next_retry(b); |
| 411 | if (r <= 0) return((long)r); | 426 | if (r <= 0) |
| 412 | ctx->obuf_off+=r; | 427 | return ((long)r); |
| 413 | ctx->obuf_len-=r; | 428 | ctx->obuf_off += r; |
| 414 | } | 429 | ctx->obuf_len -= r; |
| 415 | else | 430 | } else { |
| 416 | { | 431 | ctx->obuf_len = 0; |
| 417 | ctx->obuf_len=0; | 432 | ctx->obuf_off = 0; |
| 418 | ctx->obuf_off=0; | 433 | ret = 1; |
| 419 | ret=1; | ||
| 420 | break; | 434 | break; |
| 421 | } | ||
| 422 | } | 435 | } |
| 423 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 436 | } |
| 437 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); | ||
| 424 | break; | 438 | break; |
| 425 | case BIO_CTRL_DUP: | 439 | case BIO_CTRL_DUP: |
| 426 | dbio=(BIO *)ptr; | 440 | dbio = (BIO *)ptr; |
| 427 | if ( !BIO_set_read_buffer_size(dbio,ctx->ibuf_size) || | 441 | if (!BIO_set_read_buffer_size(dbio, ctx->ibuf_size) || |
| 428 | !BIO_set_write_buffer_size(dbio,ctx->obuf_size)) | 442 | !BIO_set_write_buffer_size(dbio, ctx->obuf_size)) |
| 429 | ret=0; | 443 | ret = 0; |
| 430 | break; | 444 | break; |
| 431 | default: | 445 | default: |
| 432 | if (b->next_bio == NULL) return(0); | 446 | if (b->next_bio == NULL) |
| 433 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 447 | return (0); |
| 448 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); | ||
| 434 | break; | 449 | break; |
| 435 | } | ||
| 436 | return(ret); | ||
| 437 | malloc_error: | ||
| 438 | BIOerr(BIO_F_BUFFER_CTRL,ERR_R_MALLOC_FAILURE); | ||
| 439 | return(0); | ||
| 440 | } | 450 | } |
| 441 | 451 | return (ret); | |
| 442 | static long buffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) | 452 | malloc_error: |
| 443 | { | 453 | BIOerr(BIO_F_BUFFER_CTRL, ERR_R_MALLOC_FAILURE); |
| 444 | long ret=1; | 454 | return (0); |
| 445 | 455 | } | |
| 446 | if (b->next_bio == NULL) return(0); | 456 | |
| 447 | switch (cmd) | 457 | static long |
| 448 | { | 458 | buffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 459 | { | ||
| 460 | long ret = 1; | ||
| 461 | |||
| 462 | if (b->next_bio == NULL) | ||
| 463 | return (0); | ||
| 464 | switch (cmd) { | ||
| 449 | default: | 465 | default: |
| 450 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | 466 | ret = BIO_callback_ctrl(b->next_bio, cmd, fp); |
| 451 | break; | 467 | break; |
| 452 | } | ||
| 453 | return(ret); | ||
| 454 | } | 468 | } |
| 469 | return (ret); | ||
| 470 | } | ||
| 455 | 471 | ||
| 456 | static int buffer_gets(BIO *b, char *buf, int size) | 472 | static int |
| 457 | { | 473 | buffer_gets(BIO *b, char *buf, int size) |
| 474 | { | ||
| 458 | BIO_F_BUFFER_CTX *ctx; | 475 | BIO_F_BUFFER_CTX *ctx; |
| 459 | int num=0,i,flag; | 476 | int num = 0, i, flag; |
| 460 | char *p; | 477 | char *p; |
| 461 | 478 | ||
| 462 | ctx=(BIO_F_BUFFER_CTX *)b->ptr; | 479 | ctx = (BIO_F_BUFFER_CTX *)b->ptr; |
| 463 | size--; /* reserve space for a '\0' */ | 480 | size--; /* reserve space for a '\0' */ |
| 464 | BIO_clear_retry_flags(b); | 481 | BIO_clear_retry_flags(b); |
| 465 | 482 | ||
| 466 | for (;;) | 483 | for (;;) { |
| 467 | { | 484 | if (ctx->ibuf_len > 0) { |
| 468 | if (ctx->ibuf_len > 0) | 485 | p = &(ctx->ibuf[ctx->ibuf_off]); |
| 469 | { | 486 | flag = 0; |
| 470 | p= &(ctx->ibuf[ctx->ibuf_off]); | 487 | for (i = 0; (i < ctx->ibuf_len) && (i < size); i++) { |
| 471 | flag=0; | 488 | *(buf++) = p[i]; |
| 472 | for (i=0; (i<ctx->ibuf_len) && (i<size); i++) | 489 | if (p[i] == '\n') { |
| 473 | { | 490 | flag = 1; |
| 474 | *(buf++)=p[i]; | ||
| 475 | if (p[i] == '\n') | ||
| 476 | { | ||
| 477 | flag=1; | ||
| 478 | i++; | 491 | i++; |
| 479 | break; | 492 | break; |
| 480 | } | ||
| 481 | } | ||
| 482 | num+=i; | ||
| 483 | size-=i; | ||
| 484 | ctx->ibuf_len-=i; | ||
| 485 | ctx->ibuf_off+=i; | ||
| 486 | if (flag || size == 0) | ||
| 487 | { | ||
| 488 | *buf='\0'; | ||
| 489 | return(num); | ||
| 490 | } | 493 | } |
| 491 | } | 494 | } |
| 495 | num += i; | ||
| 496 | size -= i; | ||
| 497 | ctx->ibuf_len -= i; | ||
| 498 | ctx->ibuf_off += i; | ||
| 499 | if (flag || size == 0) { | ||
| 500 | *buf = '\0'; | ||
| 501 | return (num); | ||
| 502 | } | ||
| 503 | } | ||
| 492 | else /* read another chunk */ | 504 | else /* read another chunk */ |
| 493 | { | 505 | { |
| 494 | i=BIO_read(b->next_bio,ctx->ibuf,ctx->ibuf_size); | 506 | i = BIO_read(b->next_bio, ctx->ibuf, ctx->ibuf_size); |
| 495 | if (i <= 0) | 507 | if (i <= 0) { |
| 496 | { | ||
| 497 | BIO_copy_next_retry(b); | 508 | BIO_copy_next_retry(b); |
| 498 | *buf='\0'; | 509 | *buf = '\0'; |
| 499 | if (i < 0) return((num > 0)?num:i); | 510 | if (i < 0) |
| 500 | if (i == 0) return(num); | 511 | return ((num > 0) ? num : i); |
| 501 | } | 512 | if (i == 0) |
| 502 | ctx->ibuf_len=i; | 513 | return (num); |
| 503 | ctx->ibuf_off=0; | ||
| 504 | } | 514 | } |
| 515 | ctx->ibuf_len = i; | ||
| 516 | ctx->ibuf_off = 0; | ||
| 505 | } | 517 | } |
| 506 | } | 518 | } |
| 519 | } | ||
| 507 | 520 | ||
| 508 | static int buffer_puts(BIO *b, const char *str) | 521 | static int |
| 509 | { | 522 | buffer_puts(BIO *b, const char *str) |
| 510 | return(buffer_write(b,str,strlen(str))); | 523 | { |
| 511 | } | 524 | return (buffer_write(b, str, strlen(str))); |
| 512 | 525 | } | |
diff --git a/src/lib/libcrypto/bio/bf_lbuf.c b/src/lib/libcrypto/bio/bf_lbuf.c index ec0f7eb0b7..838839f1bf 100644 --- a/src/lib/libcrypto/bio/bf_lbuf.c +++ b/src/lib/libcrypto/bio/bf_lbuf.c | |||
| @@ -62,7 +62,7 @@ | |||
| 62 | #include <openssl/bio.h> | 62 | #include <openssl/bio.h> |
| 63 | #include <openssl/evp.h> | 63 | #include <openssl/evp.h> |
| 64 | 64 | ||
| 65 | static int linebuffer_write(BIO *h, const char *buf,int num); | 65 | static int linebuffer_write(BIO *h, const char *buf, int num); |
| 66 | static int linebuffer_read(BIO *h, char *buf, int size); | 66 | static int linebuffer_read(BIO *h, char *buf, int size); |
| 67 | static int linebuffer_puts(BIO *h, const char *str); | 67 | static int linebuffer_puts(BIO *h, const char *str); |
| 68 | static int linebuffer_gets(BIO *h, char *str, int size); | 68 | static int linebuffer_gets(BIO *h, char *str, int size); |
| @@ -76,8 +76,7 @@ static long linebuffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); | |||
| 76 | 76 | ||
| 77 | /* #define DEBUG */ | 77 | /* #define DEBUG */ |
| 78 | 78 | ||
| 79 | static BIO_METHOD methods_linebuffer= | 79 | static BIO_METHOD methods_linebuffer = { |
| 80 | { | ||
| 81 | BIO_TYPE_LINEBUFFER, | 80 | BIO_TYPE_LINEBUFFER, |
| 82 | "linebuffer", | 81 | "linebuffer", |
| 83 | linebuffer_write, | 82 | linebuffer_write, |
| @@ -88,310 +87,313 @@ static BIO_METHOD methods_linebuffer= | |||
| 88 | linebuffer_new, | 87 | linebuffer_new, |
| 89 | linebuffer_free, | 88 | linebuffer_free, |
| 90 | linebuffer_callback_ctrl, | 89 | linebuffer_callback_ctrl, |
| 91 | }; | 90 | }; |
| 92 | 91 | ||
| 93 | BIO_METHOD *BIO_f_linebuffer(void) | 92 | BIO_METHOD |
| 94 | { | 93 | *BIO_f_linebuffer(void) |
| 95 | return(&methods_linebuffer); | 94 | { |
| 96 | } | 95 | return (&methods_linebuffer); |
| 96 | } | ||
| 97 | 97 | ||
| 98 | typedef struct bio_linebuffer_ctx_struct | 98 | typedef struct bio_linebuffer_ctx_struct { |
| 99 | { | ||
| 100 | char *obuf; /* the output char array */ | 99 | char *obuf; /* the output char array */ |
| 101 | int obuf_size; /* how big is the output buffer */ | 100 | int obuf_size; /* how big is the output buffer */ |
| 102 | int obuf_len; /* how many bytes are in it */ | 101 | int obuf_len; /* how many bytes are in it */ |
| 103 | } BIO_LINEBUFFER_CTX; | 102 | } BIO_LINEBUFFER_CTX; |
| 104 | 103 | ||
| 105 | static int linebuffer_new(BIO *bi) | 104 | static int |
| 106 | { | 105 | linebuffer_new(BIO *bi) |
| 106 | { | ||
| 107 | BIO_LINEBUFFER_CTX *ctx; | 107 | BIO_LINEBUFFER_CTX *ctx; |
| 108 | 108 | ||
| 109 | ctx=(BIO_LINEBUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_LINEBUFFER_CTX)); | 109 | ctx = (BIO_LINEBUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_LINEBUFFER_CTX)); |
| 110 | if (ctx == NULL) return(0); | 110 | if (ctx == NULL) |
| 111 | ctx->obuf=(char *)OPENSSL_malloc(DEFAULT_LINEBUFFER_SIZE); | 111 | return (0); |
| 112 | if (ctx->obuf == NULL) { OPENSSL_free(ctx); return(0); } | 112 | ctx->obuf = (char *)OPENSSL_malloc(DEFAULT_LINEBUFFER_SIZE); |
| 113 | ctx->obuf_size=DEFAULT_LINEBUFFER_SIZE; | 113 | if (ctx->obuf == NULL) { |
| 114 | ctx->obuf_len=0; | 114 | OPENSSL_free(ctx); |
| 115 | 115 | return (0); | |
| 116 | bi->init=1; | ||
| 117 | bi->ptr=(char *)ctx; | ||
| 118 | bi->flags=0; | ||
| 119 | return(1); | ||
| 120 | } | 116 | } |
| 117 | ctx->obuf_size = DEFAULT_LINEBUFFER_SIZE; | ||
| 118 | ctx->obuf_len = 0; | ||
| 119 | |||
| 120 | bi->init = 1; | ||
| 121 | bi->ptr = (char *)ctx; | ||
| 122 | bi->flags = 0; | ||
| 123 | return (1); | ||
| 124 | } | ||
| 121 | 125 | ||
| 122 | static int linebuffer_free(BIO *a) | 126 | static int |
| 123 | { | 127 | linebuffer_free(BIO *a) |
| 128 | { | ||
| 124 | BIO_LINEBUFFER_CTX *b; | 129 | BIO_LINEBUFFER_CTX *b; |
| 125 | 130 | ||
| 126 | if (a == NULL) return(0); | 131 | if (a == NULL) |
| 127 | b=(BIO_LINEBUFFER_CTX *)a->ptr; | 132 | return (0); |
| 128 | if (b->obuf != NULL) OPENSSL_free(b->obuf); | 133 | b = (BIO_LINEBUFFER_CTX *)a->ptr; |
| 134 | if (b->obuf != NULL) | ||
| 135 | OPENSSL_free(b->obuf); | ||
| 129 | OPENSSL_free(a->ptr); | 136 | OPENSSL_free(a->ptr); |
| 130 | a->ptr=NULL; | 137 | a->ptr = NULL; |
| 131 | a->init=0; | 138 | a->init = 0; |
| 132 | a->flags=0; | 139 | a->flags = 0; |
| 133 | return(1); | 140 | return (1); |
| 134 | } | 141 | } |
| 135 | 142 | ||
| 136 | static int linebuffer_read(BIO *b, char *out, int outl) | 143 | static int |
| 137 | { | 144 | linebuffer_read(BIO *b, char *out, int outl) |
| 138 | int ret=0; | 145 | { |
| 139 | 146 | int ret = 0; | |
| 140 | if (out == NULL) return(0); | 147 | |
| 141 | if (b->next_bio == NULL) return(0); | 148 | if (out == NULL) |
| 142 | ret=BIO_read(b->next_bio,out,outl); | 149 | return (0); |
| 150 | if (b->next_bio == NULL) | ||
| 151 | return (0); | ||
| 152 | ret = BIO_read(b->next_bio, out, outl); | ||
| 143 | BIO_clear_retry_flags(b); | 153 | BIO_clear_retry_flags(b); |
| 144 | BIO_copy_next_retry(b); | 154 | BIO_copy_next_retry(b); |
| 145 | return(ret); | 155 | return (ret); |
| 146 | } | 156 | } |
| 147 | 157 | ||
| 148 | static int linebuffer_write(BIO *b, const char *in, int inl) | 158 | static int |
| 149 | { | 159 | linebuffer_write(BIO *b, const char *in, int inl) |
| 150 | int i,num=0,foundnl; | 160 | { |
| 161 | int i, num = 0, foundnl; | ||
| 151 | BIO_LINEBUFFER_CTX *ctx; | 162 | BIO_LINEBUFFER_CTX *ctx; |
| 152 | 163 | ||
| 153 | if ((in == NULL) || (inl <= 0)) return(0); | 164 | if ((in == NULL) || (inl <= 0)) |
| 154 | ctx=(BIO_LINEBUFFER_CTX *)b->ptr; | 165 | return (0); |
| 155 | if ((ctx == NULL) || (b->next_bio == NULL)) return(0); | 166 | ctx = (BIO_LINEBUFFER_CTX *)b->ptr; |
| 167 | if ((ctx == NULL) || (b->next_bio == NULL)) | ||
| 168 | return (0); | ||
| 156 | 169 | ||
| 157 | BIO_clear_retry_flags(b); | 170 | BIO_clear_retry_flags(b); |
| 158 | 171 | ||
| 159 | do | 172 | do { |
| 160 | { | ||
| 161 | const char *p; | 173 | const char *p; |
| 162 | 174 | ||
| 163 | for(p = in; p < in + inl && *p != '\n'; p++) | 175 | for (p = in; p < in + inl && *p != '\n'; p++) |
| 164 | ; | 176 | ; |
| 165 | if (*p == '\n') | 177 | if (*p == '\n') { |
| 166 | { | ||
| 167 | p++; | 178 | p++; |
| 168 | foundnl = 1; | 179 | foundnl = 1; |
| 169 | } | 180 | } else |
| 170 | else | ||
| 171 | foundnl = 0; | 181 | foundnl = 0; |
| 172 | 182 | ||
| 173 | /* If a NL was found and we already have text in the save | 183 | /* If a NL was found and we already have text in the save |
| 174 | buffer, concatenate them and write */ | 184 | buffer, concatenate them and write */ |
| 175 | while ((foundnl || p - in > ctx->obuf_size - ctx->obuf_len) | 185 | while ((foundnl || p - in > ctx->obuf_size - ctx->obuf_len) && |
| 176 | && ctx->obuf_len > 0) | 186 | ctx->obuf_len > 0) { |
| 177 | { | ||
| 178 | int orig_olen = ctx->obuf_len; | 187 | int orig_olen = ctx->obuf_len; |
| 179 | 188 | ||
| 180 | i = ctx->obuf_size - ctx->obuf_len; | 189 | i = ctx->obuf_size - ctx->obuf_len; |
| 181 | if (p - in > 0) | 190 | if (p - in > 0) { |
| 182 | { | 191 | if (i >= p - in) { |
| 183 | if (i >= p - in) | ||
| 184 | { | ||
| 185 | memcpy(&(ctx->obuf[ctx->obuf_len]), | 192 | memcpy(&(ctx->obuf[ctx->obuf_len]), |
| 186 | in,p - in); | 193 | in, p - in); |
| 187 | ctx->obuf_len += p - in; | 194 | ctx->obuf_len += p - in; |
| 188 | inl -= p - in; | 195 | inl -= p - in; |
| 189 | num += p - in; | 196 | num += p - in; |
| 190 | in = p; | 197 | in = p; |
| 191 | } | 198 | } else { |
| 192 | else | ||
| 193 | { | ||
| 194 | memcpy(&(ctx->obuf[ctx->obuf_len]), | 199 | memcpy(&(ctx->obuf[ctx->obuf_len]), |
| 195 | in,i); | 200 | in, i); |
| 196 | ctx->obuf_len += i; | 201 | ctx->obuf_len += i; |
| 197 | inl -= i; | 202 | inl -= i; |
| 198 | in += i; | 203 | in += i; |
| 199 | num += i; | 204 | num += i; |
| 200 | } | ||
| 201 | } | 205 | } |
| 206 | } | ||
| 202 | 207 | ||
| 203 | #if 0 | 208 | #if 0 |
| 204 | BIO_write(b->next_bio, "<*<", 3); | 209 | BIO_write(b->next_bio, "<*<", 3); |
| 205 | #endif | 210 | #endif |
| 206 | i=BIO_write(b->next_bio, | 211 | i = BIO_write(b->next_bio, ctx->obuf, ctx->obuf_len); |
| 207 | ctx->obuf, ctx->obuf_len); | 212 | if (i <= 0) { |
| 208 | if (i <= 0) | ||
| 209 | { | ||
| 210 | ctx->obuf_len = orig_olen; | 213 | ctx->obuf_len = orig_olen; |
| 211 | BIO_copy_next_retry(b); | 214 | BIO_copy_next_retry(b); |
| 212 | |||
| 213 | #if 0 | 215 | #if 0 |
| 214 | BIO_write(b->next_bio, ">*>", 3); | 216 | BIO_write(b->next_bio, ">*>", 3); |
| 215 | #endif | 217 | #endif |
| 216 | if (i < 0) return((num > 0)?num:i); | 218 | if (i < 0) |
| 217 | if (i == 0) return(num); | 219 | return ((num > 0) ? num : i); |
| 218 | } | 220 | if (i == 0) |
| 221 | return (num); | ||
| 222 | } | ||
| 219 | #if 0 | 223 | #if 0 |
| 220 | BIO_write(b->next_bio, ">*>", 3); | 224 | BIO_write(b->next_bio, ">*>", 3); |
| 221 | #endif | 225 | #endif |
| 222 | if (i < ctx->obuf_len) | 226 | if (i < ctx->obuf_len) |
| 223 | memmove(ctx->obuf, ctx->obuf + i, | 227 | memmove(ctx->obuf, ctx->obuf + i, |
| 224 | ctx->obuf_len - i); | 228 | ctx->obuf_len - i); |
| 225 | ctx->obuf_len-=i; | 229 | ctx->obuf_len -= i; |
| 226 | } | 230 | } |
| 227 | 231 | ||
| 228 | /* Now that the save buffer is emptied, let's write the input | 232 | /* Now that the save buffer is emptied, let's write the input |
| 229 | buffer if a NL was found and there is anything to write. */ | 233 | buffer if a NL was found and there is anything to write. */ |
| 230 | if ((foundnl || p - in > ctx->obuf_size) && p - in > 0) | 234 | if ((foundnl || p - in > ctx->obuf_size) && p - in > 0) { |
| 231 | { | ||
| 232 | #if 0 | 235 | #if 0 |
| 233 | BIO_write(b->next_bio, "<*<", 3); | 236 | BIO_write(b->next_bio, "<*<", 3); |
| 234 | #endif | 237 | #endif |
| 235 | i=BIO_write(b->next_bio,in,p - in); | 238 | i = BIO_write(b->next_bio, in, p - in); |
| 236 | if (i <= 0) | 239 | if (i <= 0) { |
| 237 | { | ||
| 238 | BIO_copy_next_retry(b); | 240 | BIO_copy_next_retry(b); |
| 239 | #if 0 | 241 | #if 0 |
| 240 | BIO_write(b->next_bio, ">*>", 3); | 242 | BIO_write(b->next_bio, ">*>", 3); |
| 241 | #endif | 243 | #endif |
| 242 | if (i < 0) return((num > 0)?num:i); | 244 | if (i < 0) |
| 243 | if (i == 0) return(num); | 245 | return ((num > 0) ? num : i); |
| 244 | } | 246 | if (i == 0) |
| 247 | return (num); | ||
| 248 | } | ||
| 245 | #if 0 | 249 | #if 0 |
| 246 | BIO_write(b->next_bio, ">*>", 3); | 250 | BIO_write(b->next_bio, ">*>", 3); |
| 247 | #endif | 251 | #endif |
| 248 | num+=i; | 252 | num += i; |
| 249 | in+=i; | 253 | in += i; |
| 250 | inl-=i; | 254 | inl -= i; |
| 251 | } | ||
| 252 | } | 255 | } |
| 253 | while(foundnl && inl > 0); | 256 | } while (foundnl && inl > 0); |
| 254 | /* We've written as much as we can. The rest of the input buffer, if | 257 | /* We've written as much as we can. The rest of the input buffer, if |
| 255 | any, is text that doesn't and with a NL and therefore needs to be | 258 | any, is text that doesn't and with a NL and therefore needs to be |
| 256 | saved for the next trip. */ | 259 | saved for the next trip. */ |
| 257 | if (inl > 0) | 260 | if (inl > 0) { |
| 258 | { | ||
| 259 | memcpy(&(ctx->obuf[ctx->obuf_len]), in, inl); | 261 | memcpy(&(ctx->obuf[ctx->obuf_len]), in, inl); |
| 260 | ctx->obuf_len += inl; | 262 | ctx->obuf_len += inl; |
| 261 | num += inl; | 263 | num += inl; |
| 262 | } | ||
| 263 | return num; | ||
| 264 | } | 264 | } |
| 265 | return num; | ||
| 266 | } | ||
| 265 | 267 | ||
| 266 | static long linebuffer_ctrl(BIO *b, int cmd, long num, void *ptr) | 268 | static long |
| 267 | { | 269 | linebuffer_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 270 | { | ||
| 268 | BIO *dbio; | 271 | BIO *dbio; |
| 269 | BIO_LINEBUFFER_CTX *ctx; | 272 | BIO_LINEBUFFER_CTX *ctx; |
| 270 | long ret=1; | 273 | long ret = 1; |
| 271 | char *p; | 274 | char *p; |
| 272 | int r; | 275 | int r; |
| 273 | int obs; | 276 | int obs; |
| 274 | 277 | ||
| 275 | ctx=(BIO_LINEBUFFER_CTX *)b->ptr; | 278 | ctx = (BIO_LINEBUFFER_CTX *)b->ptr; |
| 276 | 279 | ||
| 277 | switch (cmd) | 280 | switch (cmd) { |
| 278 | { | ||
| 279 | case BIO_CTRL_RESET: | 281 | case BIO_CTRL_RESET: |
| 280 | ctx->obuf_len=0; | 282 | ctx->obuf_len = 0; |
| 281 | if (b->next_bio == NULL) return(0); | 283 | if (b->next_bio == NULL) |
| 282 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 284 | return (0); |
| 285 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); | ||
| 283 | break; | 286 | break; |
| 284 | case BIO_CTRL_INFO: | 287 | case BIO_CTRL_INFO: |
| 285 | ret=(long)ctx->obuf_len; | 288 | ret = (long)ctx->obuf_len; |
| 286 | break; | 289 | break; |
| 287 | case BIO_CTRL_WPENDING: | 290 | case BIO_CTRL_WPENDING: |
| 288 | ret=(long)ctx->obuf_len; | 291 | ret = (long)ctx->obuf_len; |
| 289 | if (ret == 0) | 292 | if (ret == 0) { |
| 290 | { | 293 | if (b->next_bio == NULL) |
| 291 | if (b->next_bio == NULL) return(0); | 294 | return (0); |
| 292 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 295 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 293 | } | 296 | } |
| 294 | break; | 297 | break; |
| 295 | case BIO_C_SET_BUFF_SIZE: | 298 | case BIO_C_SET_BUFF_SIZE: |
| 296 | obs=(int)num; | 299 | obs = (int)num; |
| 297 | p=ctx->obuf; | 300 | p = ctx->obuf; |
| 298 | if ((obs > DEFAULT_LINEBUFFER_SIZE) && (obs != ctx->obuf_size)) | 301 | if ((obs > DEFAULT_LINEBUFFER_SIZE) && (obs != ctx->obuf_size)) { |
| 299 | { | 302 | p = (char *)OPENSSL_malloc((int)num); |
| 300 | p=(char *)OPENSSL_malloc((int)num); | ||
| 301 | if (p == NULL) | 303 | if (p == NULL) |
| 302 | goto malloc_error; | 304 | goto malloc_error; |
| 303 | } | 305 | } |
| 304 | if (ctx->obuf != p) | 306 | if (ctx->obuf != p) { |
| 305 | { | 307 | if (ctx->obuf_len > obs) { |
| 306 | if (ctx->obuf_len > obs) | ||
| 307 | { | ||
| 308 | ctx->obuf_len = obs; | 308 | ctx->obuf_len = obs; |
| 309 | } | 309 | } |
| 310 | memcpy(p, ctx->obuf, ctx->obuf_len); | 310 | memcpy(p, ctx->obuf, ctx->obuf_len); |
| 311 | OPENSSL_free(ctx->obuf); | 311 | OPENSSL_free(ctx->obuf); |
| 312 | ctx->obuf=p; | 312 | ctx->obuf = p; |
| 313 | ctx->obuf_size=obs; | 313 | ctx->obuf_size = obs; |
| 314 | } | 314 | } |
| 315 | break; | 315 | break; |
| 316 | case BIO_C_DO_STATE_MACHINE: | 316 | case BIO_C_DO_STATE_MACHINE: |
| 317 | if (b->next_bio == NULL) return(0); | 317 | if (b->next_bio == NULL) |
| 318 | return (0); | ||
| 318 | BIO_clear_retry_flags(b); | 319 | BIO_clear_retry_flags(b); |
| 319 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 320 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 320 | BIO_copy_next_retry(b); | 321 | BIO_copy_next_retry(b); |
| 321 | break; | 322 | break; |
| 322 | 323 | ||
| 323 | case BIO_CTRL_FLUSH: | 324 | case BIO_CTRL_FLUSH: |
| 324 | if (b->next_bio == NULL) return(0); | 325 | if (b->next_bio == NULL) |
| 325 | if (ctx->obuf_len <= 0) | 326 | return (0); |
| 326 | { | 327 | if (ctx->obuf_len <= 0) { |
| 327 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 328 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 328 | break; | 329 | break; |
| 329 | } | 330 | } |
| 330 | 331 | ||
| 331 | for (;;) | 332 | for (;;) { |
| 332 | { | ||
| 333 | BIO_clear_retry_flags(b); | 333 | BIO_clear_retry_flags(b); |
| 334 | if (ctx->obuf_len > 0) | 334 | if (ctx->obuf_len > 0) { |
| 335 | { | 335 | r = BIO_write(b->next_bio, |
| 336 | r=BIO_write(b->next_bio, | 336 | ctx->obuf, ctx->obuf_len); |
| 337 | ctx->obuf, ctx->obuf_len); | ||
| 338 | #if 0 | 337 | #if 0 |
| 339 | fprintf(stderr,"FLUSH %3d -> %3d\n",ctx->obuf_len,r); | 338 | fprintf(stderr, "FLUSH %3d -> %3d\n", ctx->obuf_len, r); |
| 340 | #endif | 339 | #endif |
| 341 | BIO_copy_next_retry(b); | 340 | BIO_copy_next_retry(b); |
| 342 | if (r <= 0) return((long)r); | 341 | if (r <= 0) |
| 342 | return ((long)r); | ||
| 343 | if (r < ctx->obuf_len) | 343 | if (r < ctx->obuf_len) |
| 344 | memmove(ctx->obuf, ctx->obuf + r, | 344 | memmove(ctx->obuf, ctx->obuf + r, |
| 345 | ctx->obuf_len - r); | 345 | ctx->obuf_len - r); |
| 346 | ctx->obuf_len-=r; | 346 | ctx->obuf_len -= r; |
| 347 | } | 347 | } else { |
| 348 | else | 348 | ctx->obuf_len = 0; |
| 349 | { | 349 | ret = 1; |
| 350 | ctx->obuf_len=0; | ||
| 351 | ret=1; | ||
| 352 | break; | 350 | break; |
| 353 | } | ||
| 354 | } | 351 | } |
| 355 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 352 | } |
| 353 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); | ||
| 356 | break; | 354 | break; |
| 357 | case BIO_CTRL_DUP: | 355 | case BIO_CTRL_DUP: |
| 358 | dbio=(BIO *)ptr; | 356 | dbio = (BIO *)ptr; |
| 359 | if ( !BIO_set_write_buffer_size(dbio,ctx->obuf_size)) | 357 | if (!BIO_set_write_buffer_size(dbio, ctx->obuf_size)) |
| 360 | ret=0; | 358 | ret = 0; |
| 361 | break; | 359 | break; |
| 362 | default: | 360 | default: |
| 363 | if (b->next_bio == NULL) return(0); | 361 | if (b->next_bio == NULL) |
| 364 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 362 | return (0); |
| 363 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); | ||
| 365 | break; | 364 | break; |
| 366 | } | ||
| 367 | return(ret); | ||
| 368 | malloc_error: | ||
| 369 | BIOerr(BIO_F_LINEBUFFER_CTRL,ERR_R_MALLOC_FAILURE); | ||
| 370 | return(0); | ||
| 371 | } | 365 | } |
| 366 | return (ret); | ||
| 367 | malloc_error: | ||
| 368 | BIOerr(BIO_F_LINEBUFFER_CTRL, ERR_R_MALLOC_FAILURE); | ||
| 369 | return (0); | ||
| 370 | } | ||
| 372 | 371 | ||
| 373 | static long linebuffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) | 372 | static long |
| 374 | { | 373 | linebuffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 375 | long ret=1; | 374 | { |
| 375 | long ret = 1; | ||
| 376 | 376 | ||
| 377 | if (b->next_bio == NULL) return(0); | 377 | if (b->next_bio == NULL) |
| 378 | switch (cmd) | 378 | return (0); |
| 379 | { | 379 | switch (cmd) { |
| 380 | default: | 380 | default: |
| 381 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | 381 | ret = BIO_callback_ctrl(b->next_bio, cmd, fp); |
| 382 | break; | 382 | break; |
| 383 | } | ||
| 384 | return(ret); | ||
| 385 | } | 383 | } |
| 384 | return (ret); | ||
| 385 | } | ||
| 386 | 386 | ||
| 387 | static int linebuffer_gets(BIO *b, char *buf, int size) | 387 | static int |
| 388 | { | 388 | linebuffer_gets(BIO *b, char *buf, int size) |
| 389 | if (b->next_bio == NULL) return(0); | 389 | { |
| 390 | return(BIO_gets(b->next_bio,buf,size)); | 390 | if (b->next_bio == NULL) |
| 391 | } | 391 | return (0); |
| 392 | 392 | return (BIO_gets(b->next_bio, buf, size)); | |
| 393 | static int linebuffer_puts(BIO *b, const char *str) | 393 | } |
| 394 | { | ||
| 395 | return(linebuffer_write(b,str,strlen(str))); | ||
| 396 | } | ||
| 397 | 394 | ||
| 395 | static int | ||
| 396 | linebuffer_puts(BIO *b, const char *str) | ||
| 397 | { | ||
| 398 | return (linebuffer_write(b, str, strlen(str))); | ||
| 399 | } | ||
diff --git a/src/lib/libcrypto/bio/bf_nbio.c b/src/lib/libcrypto/bio/bf_nbio.c index 028616c064..76f8f31950 100644 --- a/src/lib/libcrypto/bio/bf_nbio.c +++ b/src/lib/libcrypto/bio/bf_nbio.c | |||
| @@ -65,23 +65,22 @@ | |||
| 65 | /* BIO_put and BIO_get both add to the digest, | 65 | /* BIO_put and BIO_get both add to the digest, |
| 66 | * BIO_gets returns the digest */ | 66 | * BIO_gets returns the digest */ |
| 67 | 67 | ||
| 68 | static int nbiof_write(BIO *h,const char *buf,int num); | 68 | static int nbiof_write(BIO *h, const char *buf, int num); |
| 69 | static int nbiof_read(BIO *h,char *buf,int size); | 69 | static int nbiof_read(BIO *h, char *buf, int size); |
| 70 | static int nbiof_puts(BIO *h,const char *str); | 70 | static int nbiof_puts(BIO *h, const char *str); |
| 71 | static int nbiof_gets(BIO *h,char *str,int size); | 71 | static int nbiof_gets(BIO *h, char *str, int size); |
| 72 | static long nbiof_ctrl(BIO *h,int cmd,long arg1,void *arg2); | 72 | static long nbiof_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 73 | static int nbiof_new(BIO *h); | 73 | static int nbiof_new(BIO *h); |
| 74 | static int nbiof_free(BIO *data); | 74 | static int nbiof_free(BIO *data); |
| 75 | static long nbiof_callback_ctrl(BIO *h,int cmd,bio_info_cb *fp); | 75 | static long nbiof_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); |
| 76 | typedef struct nbio_test_st | 76 | |
| 77 | { | 77 | typedef struct nbio_test_st { |
| 78 | /* only set if we sent a 'should retry' error */ | 78 | /* only set if we sent a 'should retry' error */ |
| 79 | int lrn; | 79 | int lrn; |
| 80 | int lwn; | 80 | int lwn; |
| 81 | } NBIO_TEST; | 81 | } NBIO_TEST; |
| 82 | 82 | ||
| 83 | static BIO_METHOD methods_nbiof= | 83 | static BIO_METHOD methods_nbiof = { |
| 84 | { | ||
| 85 | BIO_TYPE_NBIO_TEST, | 84 | BIO_TYPE_NBIO_TEST, |
| 86 | "non-blocking IO test filter", | 85 | "non-blocking IO test filter", |
| 87 | nbiof_write, | 86 | nbiof_write, |
| @@ -92,162 +91,170 @@ static BIO_METHOD methods_nbiof= | |||
| 92 | nbiof_new, | 91 | nbiof_new, |
| 93 | nbiof_free, | 92 | nbiof_free, |
| 94 | nbiof_callback_ctrl, | 93 | nbiof_callback_ctrl, |
| 95 | }; | 94 | }; |
| 96 | 95 | ||
| 97 | BIO_METHOD *BIO_f_nbio_test(void) | 96 | BIO_METHOD |
| 98 | { | 97 | *BIO_f_nbio_test(void) |
| 99 | return(&methods_nbiof); | 98 | { |
| 100 | } | 99 | return (&methods_nbiof); |
| 100 | } | ||
| 101 | 101 | ||
| 102 | static int nbiof_new(BIO *bi) | 102 | static int |
| 103 | { | 103 | nbiof_new(BIO *bi) |
| 104 | { | ||
| 104 | NBIO_TEST *nt; | 105 | NBIO_TEST *nt; |
| 105 | 106 | ||
| 106 | if (!(nt=(NBIO_TEST *)OPENSSL_malloc(sizeof(NBIO_TEST)))) return(0); | 107 | if (!(nt = (NBIO_TEST *)OPENSSL_malloc(sizeof(NBIO_TEST)))) |
| 107 | nt->lrn= -1; | 108 | return (0); |
| 108 | nt->lwn= -1; | 109 | nt->lrn = -1; |
| 109 | bi->ptr=(char *)nt; | 110 | nt->lwn = -1; |
| 110 | bi->init=1; | 111 | bi->ptr = (char *)nt; |
| 111 | bi->flags=0; | 112 | bi->init = 1; |
| 112 | return(1); | 113 | bi->flags = 0; |
| 113 | } | 114 | return (1); |
| 115 | } | ||
| 114 | 116 | ||
| 115 | static int nbiof_free(BIO *a) | 117 | static int |
| 116 | { | 118 | nbiof_free(BIO *a) |
| 117 | if (a == NULL) return(0); | 119 | { |
| 120 | if (a == NULL) | ||
| 121 | return (0); | ||
| 118 | if (a->ptr != NULL) | 122 | if (a->ptr != NULL) |
| 119 | OPENSSL_free(a->ptr); | 123 | OPENSSL_free(a->ptr); |
| 120 | a->ptr=NULL; | 124 | a->ptr = NULL; |
| 121 | a->init=0; | 125 | a->init = 0; |
| 122 | a->flags=0; | 126 | a->flags = 0; |
| 123 | return(1); | 127 | return (1); |
| 124 | } | 128 | } |
| 125 | 129 | ||
| 126 | static int nbiof_read(BIO *b, char *out, int outl) | 130 | static int |
| 127 | { | 131 | nbiof_read(BIO *b, char *out, int outl) |
| 128 | int ret=0; | 132 | { |
| 133 | int ret = 0; | ||
| 129 | #if 1 | 134 | #if 1 |
| 130 | int num; | 135 | int num; |
| 131 | unsigned char n; | 136 | unsigned char n; |
| 132 | #endif | 137 | #endif |
| 133 | 138 | ||
| 134 | if (out == NULL) return(0); | 139 | if (out == NULL) |
| 135 | if (b->next_bio == NULL) return(0); | 140 | return (0); |
| 141 | if (b->next_bio == NULL) | ||
| 142 | return (0); | ||
| 136 | 143 | ||
| 137 | BIO_clear_retry_flags(b); | 144 | BIO_clear_retry_flags(b); |
| 138 | #if 1 | 145 | #if 1 |
| 139 | RAND_pseudo_bytes(&n,1); | 146 | RAND_pseudo_bytes(&n, 1); |
| 140 | num=(n&0x07); | 147 | num = (n & 0x07); |
| 141 | 148 | ||
| 142 | if (outl > num) outl=num; | 149 | if (outl > num) |
| 150 | outl = num; | ||
| 143 | 151 | ||
| 144 | if (num == 0) | 152 | if (num == 0) { |
| 145 | { | 153 | ret = -1; |
| 146 | ret= -1; | ||
| 147 | BIO_set_retry_read(b); | 154 | BIO_set_retry_read(b); |
| 148 | } | 155 | } else |
| 149 | else | ||
| 150 | #endif | 156 | #endif |
| 151 | { | 157 | { |
| 152 | ret=BIO_read(b->next_bio,out,outl); | 158 | ret = BIO_read(b->next_bio, out, outl); |
| 153 | if (ret < 0) | 159 | if (ret < 0) |
| 154 | BIO_copy_next_retry(b); | 160 | BIO_copy_next_retry(b); |
| 155 | } | ||
| 156 | return(ret); | ||
| 157 | } | 161 | } |
| 162 | return (ret); | ||
| 163 | } | ||
| 158 | 164 | ||
| 159 | static int nbiof_write(BIO *b, const char *in, int inl) | 165 | static int |
| 160 | { | 166 | nbiof_write(BIO *b, const char *in, int inl) |
| 167 | { | ||
| 161 | NBIO_TEST *nt; | 168 | NBIO_TEST *nt; |
| 162 | int ret=0; | 169 | int ret = 0; |
| 163 | int num; | 170 | int num; |
| 164 | unsigned char n; | 171 | unsigned char n; |
| 165 | 172 | ||
| 166 | if ((in == NULL) || (inl <= 0)) return(0); | 173 | if ((in == NULL) || (inl <= 0)) |
| 167 | if (b->next_bio == NULL) return(0); | 174 | return (0); |
| 168 | nt=(NBIO_TEST *)b->ptr; | 175 | if (b->next_bio == NULL) |
| 176 | return (0); | ||
| 177 | nt = (NBIO_TEST *)b->ptr; | ||
| 169 | 178 | ||
| 170 | BIO_clear_retry_flags(b); | 179 | BIO_clear_retry_flags(b); |
| 171 | 180 | ||
| 172 | #if 1 | 181 | #if 1 |
| 173 | if (nt->lwn > 0) | 182 | if (nt->lwn > 0) { |
| 174 | { | 183 | num = nt->lwn; |
| 175 | num=nt->lwn; | 184 | nt->lwn = 0; |
| 176 | nt->lwn=0; | 185 | } else { |
| 177 | } | 186 | RAND_pseudo_bytes(&n, 1); |
| 178 | else | 187 | num = (n&7); |
| 179 | { | 188 | } |
| 180 | RAND_pseudo_bytes(&n,1); | ||
| 181 | num=(n&7); | ||
| 182 | } | ||
| 183 | 189 | ||
| 184 | if (inl > num) inl=num; | 190 | if (inl > num) |
| 191 | inl = num; | ||
| 185 | 192 | ||
| 186 | if (num == 0) | 193 | if (num == 0) { |
| 187 | { | 194 | ret = -1; |
| 188 | ret= -1; | ||
| 189 | BIO_set_retry_write(b); | 195 | BIO_set_retry_write(b); |
| 190 | } | 196 | } else |
| 191 | else | ||
| 192 | #endif | 197 | #endif |
| 193 | { | 198 | { |
| 194 | ret=BIO_write(b->next_bio,in,inl); | 199 | ret = BIO_write(b->next_bio, in, inl); |
| 195 | if (ret < 0) | 200 | if (ret < 0) { |
| 196 | { | ||
| 197 | BIO_copy_next_retry(b); | 201 | BIO_copy_next_retry(b); |
| 198 | nt->lwn=inl; | 202 | nt->lwn = inl; |
| 199 | } | ||
| 200 | } | 203 | } |
| 201 | return(ret); | ||
| 202 | } | 204 | } |
| 205 | return (ret); | ||
| 206 | } | ||
| 203 | 207 | ||
| 204 | static long nbiof_ctrl(BIO *b, int cmd, long num, void *ptr) | 208 | static long |
| 205 | { | 209 | nbiof_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 210 | { | ||
| 206 | long ret; | 211 | long ret; |
| 207 | 212 | ||
| 208 | if (b->next_bio == NULL) return(0); | 213 | if (b->next_bio == NULL) |
| 209 | switch (cmd) | 214 | return (0); |
| 210 | { | 215 | switch (cmd) { |
| 211 | case BIO_C_DO_STATE_MACHINE: | 216 | case BIO_C_DO_STATE_MACHINE: |
| 212 | BIO_clear_retry_flags(b); | 217 | BIO_clear_retry_flags(b); |
| 213 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 218 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 214 | BIO_copy_next_retry(b); | 219 | BIO_copy_next_retry(b); |
| 215 | break; | 220 | break; |
| 216 | case BIO_CTRL_DUP: | 221 | case BIO_CTRL_DUP: |
| 217 | ret=0L; | 222 | ret = 0L; |
| 218 | break; | 223 | break; |
| 219 | default: | 224 | default: |
| 220 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 225 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 221 | break; | 226 | break; |
| 222 | } | ||
| 223 | return(ret); | ||
| 224 | } | 227 | } |
| 228 | return (ret); | ||
| 229 | } | ||
| 225 | 230 | ||
| 226 | static long nbiof_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) | 231 | static long |
| 227 | { | 232 | nbiof_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 228 | long ret=1; | 233 | { |
| 234 | long ret = 1; | ||
| 229 | 235 | ||
| 230 | if (b->next_bio == NULL) return(0); | 236 | if (b->next_bio == NULL) |
| 231 | switch (cmd) | 237 | return (0); |
| 232 | { | 238 | switch (cmd) { |
| 233 | default: | 239 | default: |
| 234 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | 240 | ret = BIO_callback_ctrl(b->next_bio, cmd, fp); |
| 235 | break; | 241 | break; |
| 236 | } | ||
| 237 | return(ret); | ||
| 238 | } | ||
| 239 | |||
| 240 | static int nbiof_gets(BIO *bp, char *buf, int size) | ||
| 241 | { | ||
| 242 | if (bp->next_bio == NULL) return(0); | ||
| 243 | return(BIO_gets(bp->next_bio,buf,size)); | ||
| 244 | } | ||
| 245 | |||
| 246 | |||
| 247 | static int nbiof_puts(BIO *bp, const char *str) | ||
| 248 | { | ||
| 249 | if (bp->next_bio == NULL) return(0); | ||
| 250 | return(BIO_puts(bp->next_bio,str)); | ||
| 251 | } | 242 | } |
| 243 | return (ret); | ||
| 244 | } | ||
| 252 | 245 | ||
| 246 | static int | ||
| 247 | nbiof_gets(BIO *bp, char *buf, int size) | ||
| 248 | { | ||
| 249 | if (bp->next_bio == NULL) | ||
| 250 | return (0); | ||
| 251 | return (BIO_gets(bp->next_bio, buf, size)); | ||
| 252 | } | ||
| 253 | 253 | ||
| 254 | static int | ||
| 255 | nbiof_puts(BIO *bp, const char *str) | ||
| 256 | { | ||
| 257 | if (bp->next_bio == NULL) | ||
| 258 | return (0); | ||
| 259 | return (BIO_puts(bp->next_bio, str)); | ||
| 260 | } | ||
diff --git a/src/lib/libcrypto/bio/bf_null.c b/src/lib/libcrypto/bio/bf_null.c index c1bf39a904..354731c0c7 100644 --- a/src/lib/libcrypto/bio/bf_null.c +++ b/src/lib/libcrypto/bio/bf_null.c | |||
| @@ -72,8 +72,8 @@ static long nullf_ctrl(BIO *h, int cmd, long arg1, void *arg2); | |||
| 72 | static int nullf_new(BIO *h); | 72 | static int nullf_new(BIO *h); |
| 73 | static int nullf_free(BIO *data); | 73 | static int nullf_free(BIO *data); |
| 74 | static long nullf_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); | 74 | static long nullf_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); |
| 75 | static BIO_METHOD methods_nullf= | 75 | |
| 76 | { | 76 | static BIO_METHOD methods_nullf = { |
| 77 | BIO_TYPE_NULL_FILTER, | 77 | BIO_TYPE_NULL_FILTER, |
| 78 | "NULL filter", | 78 | "NULL filter", |
| 79 | nullf_write, | 79 | nullf_write, |
| @@ -84,100 +84,113 @@ static BIO_METHOD methods_nullf= | |||
| 84 | nullf_new, | 84 | nullf_new, |
| 85 | nullf_free, | 85 | nullf_free, |
| 86 | nullf_callback_ctrl, | 86 | nullf_callback_ctrl, |
| 87 | }; | 87 | }; |
| 88 | 88 | ||
| 89 | BIO_METHOD *BIO_f_null(void) | 89 | BIO_METHOD |
| 90 | { | 90 | *BIO_f_null(void) |
| 91 | return(&methods_nullf); | 91 | { |
| 92 | } | 92 | return (&methods_nullf); |
| 93 | 93 | } | |
| 94 | static int nullf_new(BIO *bi) | 94 | |
| 95 | { | 95 | static int |
| 96 | bi->init=1; | 96 | nullf_new(BIO *bi) |
| 97 | bi->ptr=NULL; | 97 | { |
| 98 | bi->flags=0; | 98 | bi->init = 1; |
| 99 | return(1); | 99 | bi->ptr = NULL; |
| 100 | } | 100 | bi->flags = 0; |
| 101 | 101 | return (1); | |
| 102 | static int nullf_free(BIO *a) | 102 | } |
| 103 | { | 103 | |
| 104 | if (a == NULL) return(0); | 104 | static int |
| 105 | nullf_free(BIO *a) | ||
| 106 | { | ||
| 107 | if (a == NULL) | ||
| 108 | return (0); | ||
| 105 | /* a->ptr=NULL; | 109 | /* a->ptr=NULL; |
| 106 | a->init=0; | 110 | a->init=0; |
| 107 | a->flags=0;*/ | 111 | a->flags=0;*/ |
| 108 | return(1); | 112 | return (1); |
| 109 | } | 113 | } |
| 110 | 114 | ||
| 111 | static int nullf_read(BIO *b, char *out, int outl) | 115 | static int |
| 112 | { | 116 | nullf_read(BIO *b, char *out, int outl) |
| 113 | int ret=0; | 117 | { |
| 114 | 118 | int ret = 0; | |
| 115 | if (out == NULL) return(0); | 119 | |
| 116 | if (b->next_bio == NULL) return(0); | 120 | if (out == NULL) |
| 117 | ret=BIO_read(b->next_bio,out,outl); | 121 | return (0); |
| 122 | if (b->next_bio == NULL) | ||
| 123 | return (0); | ||
| 124 | ret = BIO_read(b->next_bio, out, outl); | ||
| 118 | BIO_clear_retry_flags(b); | 125 | BIO_clear_retry_flags(b); |
| 119 | BIO_copy_next_retry(b); | 126 | BIO_copy_next_retry(b); |
| 120 | return(ret); | 127 | return (ret); |
| 121 | } | 128 | } |
| 122 | 129 | ||
| 123 | static int nullf_write(BIO *b, const char *in, int inl) | 130 | static int |
| 124 | { | 131 | nullf_write(BIO *b, const char *in, int inl) |
| 125 | int ret=0; | 132 | { |
| 126 | 133 | int ret = 0; | |
| 127 | if ((in == NULL) || (inl <= 0)) return(0); | 134 | |
| 128 | if (b->next_bio == NULL) return(0); | 135 | if ((in == NULL) || (inl <= 0)) |
| 129 | ret=BIO_write(b->next_bio,in,inl); | 136 | return (0); |
| 137 | if (b->next_bio == NULL) | ||
| 138 | return (0); | ||
| 139 | ret = BIO_write(b->next_bio, in, inl); | ||
| 130 | BIO_clear_retry_flags(b); | 140 | BIO_clear_retry_flags(b); |
| 131 | BIO_copy_next_retry(b); | 141 | BIO_copy_next_retry(b); |
| 132 | return(ret); | 142 | return (ret); |
| 133 | } | 143 | } |
| 134 | 144 | ||
| 135 | static long nullf_ctrl(BIO *b, int cmd, long num, void *ptr) | 145 | static long |
| 136 | { | 146 | nullf_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 147 | { | ||
| 137 | long ret; | 148 | long ret; |
| 138 | 149 | ||
| 139 | if (b->next_bio == NULL) return(0); | 150 | if (b->next_bio == NULL) |
| 140 | switch(cmd) | 151 | return (0); |
| 141 | { | 152 | switch (cmd) { |
| 142 | case BIO_C_DO_STATE_MACHINE: | 153 | case BIO_C_DO_STATE_MACHINE: |
| 143 | BIO_clear_retry_flags(b); | 154 | BIO_clear_retry_flags(b); |
| 144 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 155 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 145 | BIO_copy_next_retry(b); | 156 | BIO_copy_next_retry(b); |
| 146 | break; | 157 | break; |
| 147 | case BIO_CTRL_DUP: | 158 | case BIO_CTRL_DUP: |
| 148 | ret=0L; | 159 | ret = 0L; |
| 149 | break; | 160 | break; |
| 150 | default: | 161 | default: |
| 151 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 162 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 152 | } | ||
| 153 | return(ret); | ||
| 154 | } | 163 | } |
| 164 | return (ret); | ||
| 165 | } | ||
| 155 | 166 | ||
| 156 | static long nullf_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) | 167 | static long |
| 157 | { | 168 | nullf_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 158 | long ret=1; | 169 | { |
| 170 | long ret = 1; | ||
| 159 | 171 | ||
| 160 | if (b->next_bio == NULL) return(0); | 172 | if (b->next_bio == NULL) |
| 161 | switch (cmd) | 173 | return (0); |
| 162 | { | 174 | switch (cmd) { |
| 163 | default: | 175 | default: |
| 164 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | 176 | ret = BIO_callback_ctrl(b->next_bio, cmd, fp); |
| 165 | break; | 177 | break; |
| 166 | } | ||
| 167 | return(ret); | ||
| 168 | } | 178 | } |
| 169 | 179 | return (ret); | |
| 170 | static int nullf_gets(BIO *bp, char *buf, int size) | 180 | } |
| 171 | { | 181 | |
| 172 | if (bp->next_bio == NULL) return(0); | 182 | static int |
| 173 | return(BIO_gets(bp->next_bio,buf,size)); | 183 | nullf_gets(BIO *bp, char *buf, int size) |
| 174 | } | 184 | { |
| 175 | 185 | if (bp->next_bio == NULL) | |
| 176 | 186 | return (0); | |
| 177 | static int nullf_puts(BIO *bp, const char *str) | 187 | return (BIO_gets(bp->next_bio, buf, size)); |
| 178 | { | 188 | } |
| 179 | if (bp->next_bio == NULL) return(0); | 189 | |
| 180 | return(BIO_puts(bp->next_bio,str)); | 190 | static int |
| 181 | } | 191 | nullf_puts(BIO *bp, const char *str) |
| 182 | 192 | { | |
| 183 | 193 | if (bp->next_bio == NULL) | |
| 194 | return (0); | ||
| 195 | return (BIO_puts(bp->next_bio, str)); | ||
| 196 | } | ||
diff --git a/src/lib/libcrypto/bio/bio.h b/src/lib/libcrypto/bio/bio.h index 05699ab212..4f1d02ada5 100644 --- a/src/lib/libcrypto/bio/bio.h +++ b/src/lib/libcrypto/bio/bio.h | |||
| @@ -151,7 +151,7 @@ extern "C" { | |||
| 151 | 151 | ||
| 152 | #define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37 /* flag whether the last */ | 152 | #define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37 /* flag whether the last */ |
| 153 | #define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38 /* I/O operation tiemd out */ | 153 | #define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38 /* I/O operation tiemd out */ |
| 154 | 154 | ||
| 155 | /* #ifdef IP_MTU_DISCOVER */ | 155 | /* #ifdef IP_MTU_DISCOVER */ |
| 156 | #define BIO_CTRL_DGRAM_MTU_DISCOVER 39 /* set DF bit on egress packets */ | 156 | #define BIO_CTRL_DGRAM_MTU_DISCOVER 39 /* set DF bit on egress packets */ |
| 157 | /* #endif */ | 157 | /* #endif */ |
| @@ -282,9 +282,10 @@ void BIO_clear_flags(BIO *b, int flags); | |||
| 282 | #define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) | 282 | #define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) |
| 283 | #define BIO_cb_post(a) ((a)&BIO_CB_RETURN) | 283 | #define BIO_cb_post(a) ((a)&BIO_CB_RETURN) |
| 284 | 284 | ||
| 285 | long (*BIO_get_callback(const BIO *b)) (struct bio_st *,int,const char *,int, long,long); | 285 | long (*BIO_get_callback(const BIO *b))(struct bio_st *, int, const char *, |
| 286 | void BIO_set_callback(BIO *b, | 286 | int, long, long); |
| 287 | long (*callback)(struct bio_st *,int,const char *,int, long,long)); | 287 | void BIO_set_callback(BIO *b, |
| 288 | long (*callback)(struct bio_st *, int, const char *, int, long, long)); | ||
| 288 | char *BIO_get_callback_arg(const BIO *b); | 289 | char *BIO_get_callback_arg(const BIO *b); |
| 289 | void BIO_set_callback_arg(BIO *b, char *arg); | 290 | void BIO_set_callback_arg(BIO *b, char *arg); |
| 290 | 291 | ||
| @@ -293,8 +294,7 @@ int BIO_method_type(const BIO *b); | |||
| 293 | 294 | ||
| 294 | typedef void bio_info_cb(struct bio_st *, int, const char *, int, long, long); | 295 | typedef void bio_info_cb(struct bio_st *, int, const char *, int, long, long); |
| 295 | 296 | ||
| 296 | typedef struct bio_method_st | 297 | typedef struct bio_method_st { |
| 297 | { | ||
| 298 | int type; | 298 | int type; |
| 299 | const char *name; | 299 | const char *name; |
| 300 | int (*bwrite)(BIO *, const char *, int); | 300 | int (*bwrite)(BIO *, const char *, int); |
| @@ -304,14 +304,13 @@ typedef struct bio_method_st | |||
| 304 | long (*ctrl)(BIO *, int, long, void *); | 304 | long (*ctrl)(BIO *, int, long, void *); |
| 305 | int (*create)(BIO *); | 305 | int (*create)(BIO *); |
| 306 | int (*destroy)(BIO *); | 306 | int (*destroy)(BIO *); |
| 307 | long (*callback_ctrl)(BIO *, int, bio_info_cb *); | 307 | long (*callback_ctrl)(BIO *, int, bio_info_cb *); |
| 308 | } BIO_METHOD; | 308 | } BIO_METHOD; |
| 309 | 309 | ||
| 310 | struct bio_st | 310 | struct bio_st { |
| 311 | { | ||
| 312 | BIO_METHOD *method; | 311 | BIO_METHOD *method; |
| 313 | /* bio, mode, argp, argi, argl, ret */ | 312 | /* bio, mode, argp, argi, argl, ret */ |
| 314 | long (*callback)(struct bio_st *,int,const char *,int, long,long); | 313 | long (*callback)(struct bio_st *, int, const char *, int, long, long); |
| 315 | char *cb_arg; /* first argument for the callback */ | 314 | char *cb_arg; /* first argument for the callback */ |
| 316 | 315 | ||
| 317 | int init; | 316 | int init; |
| @@ -327,12 +326,11 @@ struct bio_st | |||
| 327 | unsigned long num_write; | 326 | unsigned long num_write; |
| 328 | 327 | ||
| 329 | CRYPTO_EX_DATA ex_data; | 328 | CRYPTO_EX_DATA ex_data; |
| 330 | }; | 329 | }; |
| 331 | 330 | ||
| 332 | DECLARE_STACK_OF(BIO) | 331 | DECLARE_STACK_OF(BIO) |
| 333 | 332 | ||
| 334 | typedef struct bio_f_buffer_ctx_struct | 333 | typedef struct bio_f_buffer_ctx_struct { |
| 335 | { | ||
| 336 | /* Buffers are setup like this: | 334 | /* Buffers are setup like this: |
| 337 | * | 335 | * |
| 338 | * <---------------------- size -----------------------> | 336 | * <---------------------- size -----------------------> |
| @@ -346,30 +344,28 @@ typedef struct bio_f_buffer_ctx_struct | |||
| 346 | int ibuf_size; /* how big is the input buffer */ | 344 | int ibuf_size; /* how big is the input buffer */ |
| 347 | int obuf_size; /* how big is the output buffer */ | 345 | int obuf_size; /* how big is the output buffer */ |
| 348 | 346 | ||
| 349 | char *ibuf; /* the char array */ | 347 | char *ibuf; /* the char array */ |
| 350 | int ibuf_len; /* how many bytes are in it */ | 348 | int ibuf_len; /* how many bytes are in it */ |
| 351 | int ibuf_off; /* write/read offset */ | 349 | int ibuf_off; /* write/read offset */ |
| 352 | 350 | ||
| 353 | char *obuf; /* the char array */ | 351 | char *obuf; /* the char array */ |
| 354 | int obuf_len; /* how many bytes are in it */ | 352 | int obuf_len; /* how many bytes are in it */ |
| 355 | int obuf_off; /* write/read offset */ | 353 | int obuf_off; /* write/read offset */ |
| 356 | } BIO_F_BUFFER_CTX; | 354 | } BIO_F_BUFFER_CTX; |
| 357 | 355 | ||
| 358 | /* Prefix and suffix callback in ASN1 BIO */ | 356 | /* Prefix and suffix callback in ASN1 BIO */ |
| 359 | typedef int asn1_ps_func(BIO *b, unsigned char **pbuf, int *plen, void *parg); | 357 | typedef int asn1_ps_func(BIO *b, unsigned char **pbuf, int *plen, void *parg); |
| 360 | 358 | ||
| 361 | #ifndef OPENSSL_NO_SCTP | 359 | #ifndef OPENSSL_NO_SCTP |
| 362 | /* SCTP parameter structs */ | 360 | /* SCTP parameter structs */ |
| 363 | struct bio_dgram_sctp_sndinfo | 361 | struct bio_dgram_sctp_sndinfo { |
| 364 | { | ||
| 365 | uint16_t snd_sid; | 362 | uint16_t snd_sid; |
| 366 | uint16_t snd_flags; | 363 | uint16_t snd_flags; |
| 367 | uint32_t snd_ppid; | 364 | uint32_t snd_ppid; |
| 368 | uint32_t snd_context; | 365 | uint32_t snd_context; |
| 369 | }; | 366 | }; |
| 370 | 367 | ||
| 371 | struct bio_dgram_sctp_rcvinfo | 368 | struct bio_dgram_sctp_rcvinfo { |
| 372 | { | ||
| 373 | uint16_t rcv_sid; | 369 | uint16_t rcv_sid; |
| 374 | uint16_t rcv_ssn; | 370 | uint16_t rcv_ssn; |
| 375 | uint16_t rcv_flags; | 371 | uint16_t rcv_flags; |
| @@ -377,13 +373,12 @@ struct bio_dgram_sctp_rcvinfo | |||
| 377 | uint32_t rcv_tsn; | 373 | uint32_t rcv_tsn; |
| 378 | uint32_t rcv_cumtsn; | 374 | uint32_t rcv_cumtsn; |
| 379 | uint32_t rcv_context; | 375 | uint32_t rcv_context; |
| 380 | }; | 376 | }; |
| 381 | 377 | ||
| 382 | struct bio_dgram_sctp_prinfo | 378 | struct bio_dgram_sctp_prinfo { |
| 383 | { | ||
| 384 | uint16_t pr_policy; | 379 | uint16_t pr_policy; |
| 385 | uint32_t pr_value; | 380 | uint32_t pr_value; |
| 386 | }; | 381 | }; |
| 387 | #endif | 382 | #endif |
| 388 | 383 | ||
| 389 | /* connect BIO stuff */ | 384 | /* connect BIO stuff */ |
| @@ -519,7 +514,7 @@ struct bio_dgram_sctp_prinfo | |||
| 519 | /* If you are wondering why this isn't defined, its because CONST_STRICT is | 514 | /* If you are wondering why this isn't defined, its because CONST_STRICT is |
| 520 | * purely a compile-time kludge to allow const to be checked. | 515 | * purely a compile-time kludge to allow const to be checked. |
| 521 | */ | 516 | */ |
| 522 | int BIO_read_filename(BIO *b,const char *name); | 517 | int BIO_read_filename(BIO *b, const char *name); |
| 523 | #else | 518 | #else |
| 524 | #define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ | 519 | #define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ |
| 525 | BIO_CLOSE|BIO_FP_READ,(char *)name) | 520 | BIO_CLOSE|BIO_FP_READ,(char *)name) |
| @@ -611,22 +606,27 @@ int BIO_ctrl_reset_read_request(BIO *b); | |||
| 611 | /* These two aren't currently implemented */ | 606 | /* These two aren't currently implemented */ |
| 612 | /* int BIO_get_ex_num(BIO *bio); */ | 607 | /* int BIO_get_ex_num(BIO *bio); */ |
| 613 | /* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */ | 608 | /* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */ |
| 614 | int BIO_set_ex_data(BIO *bio,int idx,void *data); | 609 | int BIO_set_ex_data(BIO *bio, int idx, void *data); |
| 615 | void *BIO_get_ex_data(BIO *bio,int idx); | 610 | void *BIO_get_ex_data(BIO *bio, int idx); |
| 616 | int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | 611 | int |
| 617 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); | 612 | BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, |
| 613 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); | ||
| 618 | unsigned long BIO_number_read(BIO *bio); | 614 | unsigned long BIO_number_read(BIO *bio); |
| 619 | unsigned long BIO_number_written(BIO *bio); | 615 | unsigned long BIO_number_written(BIO *bio); |
| 620 | 616 | ||
| 621 | /* For BIO_f_asn1() */ | 617 | /* For BIO_f_asn1() */ |
| 622 | int BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, | 618 | int |
| 623 | asn1_ps_func *prefix_free); | 619 | BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, |
| 624 | int BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, | 620 | asn1_ps_func *prefix_free); |
| 625 | asn1_ps_func **pprefix_free); | 621 | int |
| 626 | int BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, | 622 | BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, |
| 627 | asn1_ps_func *suffix_free); | 623 | asn1_ps_func **pprefix_free); |
| 628 | int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, | 624 | int |
| 629 | asn1_ps_func **psuffix_free); | 625 | BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, |
| 626 | asn1_ps_func *suffix_free); | ||
| 627 | int | ||
| 628 | BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, | ||
| 629 | asn1_ps_func **psuffix_free); | ||
| 630 | 630 | ||
| 631 | # ifndef OPENSSL_NO_FP_API | 631 | # ifndef OPENSSL_NO_FP_API |
| 632 | BIO_METHOD *BIO_s_file(void ); | 632 | BIO_METHOD *BIO_s_file(void ); |
| @@ -635,22 +635,23 @@ BIO *BIO_new_fp(FILE *stream, int close_flag); | |||
| 635 | # define BIO_s_file_internal BIO_s_file | 635 | # define BIO_s_file_internal BIO_s_file |
| 636 | # endif | 636 | # endif |
| 637 | BIO * BIO_new(BIO_METHOD *type); | 637 | BIO * BIO_new(BIO_METHOD *type); |
| 638 | int BIO_set(BIO *a,BIO_METHOD *type); | 638 | int BIO_set(BIO *a, BIO_METHOD *type); |
| 639 | int BIO_free(BIO *a); | 639 | int BIO_free(BIO *a); |
| 640 | void BIO_vfree(BIO *a); | 640 | void BIO_vfree(BIO *a); |
| 641 | int BIO_read(BIO *b, void *data, int len); | 641 | int BIO_read(BIO *b, void *data, int len); |
| 642 | int BIO_gets(BIO *bp,char *buf, int size); | 642 | int BIO_gets(BIO *bp, char *buf, int size); |
| 643 | int BIO_write(BIO *b, const void *data, int len); | 643 | int BIO_write(BIO *b, const void *data, int len); |
| 644 | int BIO_puts(BIO *bp,const char *buf); | 644 | int BIO_puts(BIO *bp, const char *buf); |
| 645 | int BIO_indent(BIO *b,int indent,int max); | 645 | int BIO_indent(BIO *b, int indent, int max); |
| 646 | long BIO_ctrl(BIO *bp,int cmd,long larg,void *parg); | 646 | long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg); |
| 647 | long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long)); | 647 | long BIO_callback_ctrl(BIO *b, int cmd, |
| 648 | char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg); | 648 | void (*fp)(struct bio_st *, int, const char *, int, long, long)); |
| 649 | long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg); | 649 | char * BIO_ptr_ctrl(BIO *bp, int cmd, long larg); |
| 650 | BIO * BIO_push(BIO *b,BIO *append); | 650 | long BIO_int_ctrl(BIO *bp, int cmd, long larg, int iarg); |
| 651 | BIO * BIO_push(BIO *b, BIO *append); | ||
| 651 | BIO * BIO_pop(BIO *b); | 652 | BIO * BIO_pop(BIO *b); |
| 652 | void BIO_free_all(BIO *a); | 653 | void BIO_free_all(BIO *a); |
| 653 | BIO * BIO_find_type(BIO *b,int bio_type); | 654 | BIO * BIO_find_type(BIO *b, int bio_type); |
| 654 | BIO * BIO_next(BIO *b); | 655 | BIO * BIO_next(BIO *b); |
| 655 | BIO * BIO_get_retry_BIO(BIO *bio, int *reason); | 656 | BIO * BIO_get_retry_BIO(BIO *bio, int *reason); |
| 656 | int BIO_get_retry_reason(BIO *bio); | 657 | int BIO_get_retry_reason(BIO *bio); |
| @@ -661,8 +662,8 @@ int BIO_nread(BIO *bio, char **buf, int num); | |||
| 661 | int BIO_nwrite0(BIO *bio, char **buf); | 662 | int BIO_nwrite0(BIO *bio, char **buf); |
| 662 | int BIO_nwrite(BIO *bio, char **buf, int num); | 663 | int BIO_nwrite(BIO *bio, char **buf, int num); |
| 663 | 664 | ||
| 664 | long BIO_debug_callback(BIO *bio,int cmd,const char *argp,int argi, | 665 | long BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi, |
| 665 | long argl,long ret); | 666 | long argl, long ret); |
| 666 | 667 | ||
| 667 | BIO_METHOD *BIO_s_mem(void); | 668 | BIO_METHOD *BIO_s_mem(void); |
| 668 | BIO *BIO_new_mem_buf(void *buf, int len); | 669 | BIO *BIO_new_mem_buf(void *buf, int len); |
| @@ -696,12 +697,14 @@ int BIO_dgram_non_fatal_error(int error); | |||
| 696 | 697 | ||
| 697 | int BIO_fd_should_retry(int i); | 698 | int BIO_fd_should_retry(int i); |
| 698 | int BIO_fd_non_fatal_error(int error); | 699 | int BIO_fd_non_fatal_error(int error); |
| 699 | int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), | 700 | int |
| 700 | void *u, const char *s, int len); | 701 | BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), |
| 701 | int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), | 702 | void *u, const char *s, int len); |
| 702 | void *u, const char *s, int len, int indent); | 703 | int |
| 703 | int BIO_dump(BIO *b,const char *bytes,int len); | 704 | BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), |
| 704 | int BIO_dump_indent(BIO *b,const char *bytes,int len,int indent); | 705 | void *u, const char *s, int len, int indent); |
| 706 | int BIO_dump(BIO *b, const char *bytes, int len); | ||
| 707 | int BIO_dump_indent(BIO *b, const char *bytes, int len, int indent); | ||
| 705 | #ifndef OPENSSL_NO_FP_API | 708 | #ifndef OPENSSL_NO_FP_API |
| 706 | int BIO_dump_fp(FILE *fp, const char *s, int len); | 709 | int BIO_dump_fp(FILE *fp, const char *s, int len); |
| 707 | int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); | 710 | int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); |
| @@ -717,23 +720,24 @@ struct hostent *BIO_gethostbyname(const char *name); | |||
| 717 | */ | 720 | */ |
| 718 | int BIO_sock_error(int sock); | 721 | int BIO_sock_error(int sock); |
| 719 | int BIO_socket_ioctl(int fd, long type, void *arg); | 722 | int BIO_socket_ioctl(int fd, long type, void *arg); |
| 720 | int BIO_socket_nbio(int fd,int mode); | 723 | int BIO_socket_nbio(int fd, int mode); |
| 721 | int BIO_get_port(const char *str, unsigned short *port_ptr); | 724 | int BIO_get_port(const char *str, unsigned short *port_ptr); |
| 722 | int BIO_get_host_ip(const char *str, unsigned char *ip); | 725 | int BIO_get_host_ip(const char *str, unsigned char *ip); |
| 723 | int BIO_get_accept_socket(char *host_port,int mode); | 726 | int BIO_get_accept_socket(char *host_port, int mode); |
| 724 | int BIO_accept(int sock,char **ip_port); | 727 | int BIO_accept(int sock, char **ip_port); |
| 725 | int BIO_sock_init(void ); | 728 | int BIO_sock_init(void ); |
| 726 | void BIO_sock_cleanup(void); | 729 | void BIO_sock_cleanup(void); |
| 727 | int BIO_set_tcp_ndelay(int sock,int turn_on); | 730 | int BIO_set_tcp_ndelay(int sock, int turn_on); |
| 728 | 731 | ||
| 729 | BIO *BIO_new_socket(int sock, int close_flag); | 732 | BIO *BIO_new_socket(int sock, int close_flag); |
| 730 | BIO *BIO_new_dgram(int fd, int close_flag); | 733 | BIO *BIO_new_dgram(int fd, int close_flag); |
| 731 | #ifndef OPENSSL_NO_SCTP | 734 | #ifndef OPENSSL_NO_SCTP |
| 732 | BIO *BIO_new_dgram_sctp(int fd, int close_flag); | 735 | BIO *BIO_new_dgram_sctp(int fd, int close_flag); |
| 733 | int BIO_dgram_is_sctp(BIO *bio); | 736 | int BIO_dgram_is_sctp(BIO *bio); |
| 734 | int BIO_dgram_sctp_notification_cb(BIO *b, | 737 | int |
| 735 | void (*handle_notifications)(BIO *bio, void *context, void *buf), | 738 | BIO_dgram_sctp_notification_cb(BIO *b, |
| 736 | void *context); | 739 | void (*handle_notifications)(BIO *bio, void *context, void *buf), |
| 740 | void *context); | ||
| 737 | int BIO_dgram_sctp_wait_for_dry(BIO *b); | 741 | int BIO_dgram_sctp_wait_for_dry(BIO *b); |
| 738 | int BIO_dgram_sctp_msg_waiting(BIO *b); | 742 | int BIO_dgram_sctp_msg_waiting(BIO *b); |
| 739 | #endif | 743 | #endif |
| @@ -741,8 +745,9 @@ BIO *BIO_new_fd(int fd, int close_flag); | |||
| 741 | BIO *BIO_new_connect(char *host_port); | 745 | BIO *BIO_new_connect(char *host_port); |
| 742 | BIO *BIO_new_accept(char *host_port); | 746 | BIO *BIO_new_accept(char *host_port); |
| 743 | 747 | ||
| 744 | int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, | 748 | int |
| 745 | BIO **bio2, size_t writebuf2); | 749 | BIO_new_bio_pair(BIO **bio1, size_t writebuf1, |
| 750 | BIO **bio2, size_t writebuf2); | ||
| 746 | /* If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. | 751 | /* If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. |
| 747 | * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. | 752 | * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. |
| 748 | * Size 0 uses default value. | 753 | * Size 0 uses default value. |
| @@ -757,14 +762,18 @@ void BIO_copy_next_retry(BIO *b); | |||
| 757 | #else | 762 | #else |
| 758 | # define __bio_h__attr__(x) | 763 | # define __bio_h__attr__(x) |
| 759 | #endif | 764 | #endif |
| 760 | int BIO_printf(BIO *bio, const char *format, ...) | 765 | int |
| 761 | __bio_h__attr__((__format__(__printf__,2,3))); | 766 | BIO_printf(BIO *bio, const char *format, ...) |
| 762 | int BIO_vprintf(BIO *bio, const char *format, va_list args) | 767 | __bio_h__attr__((__format__(__printf__, 2, 3))); |
| 763 | __bio_h__attr__((__format__(__printf__,2,0))); | 768 | int |
| 764 | int BIO_snprintf(char *buf, size_t n, const char *format, ...) | 769 | BIO_vprintf(BIO *bio, const char *format, va_list args) |
| 765 | __bio_h__attr__((__format__(__printf__,3,4))); | 770 | __bio_h__attr__((__format__(__printf__, 2, 0))); |
| 766 | int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) | 771 | int |
| 767 | __bio_h__attr__((__format__(__printf__,3,0))); | 772 | BIO_snprintf(char *buf, size_t n, const char *format, ...) |
| 773 | __bio_h__attr__((__format__(__printf__, 3, 4))); | ||
| 774 | int | ||
| 775 | BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) | ||
| 776 | __bio_h__attr__((__format__(__printf__, 3, 0))); | ||
| 768 | #undef __bio_h__attr__ | 777 | #undef __bio_h__attr__ |
| 769 | 778 | ||
| 770 | /* BEGIN ERROR CODES */ | 779 | /* BEGIN ERROR CODES */ |
diff --git a/src/lib/libcrypto/bio/bio_cb.c b/src/lib/libcrypto/bio/bio_cb.c index 78c8974ab4..3e110f3751 100644 --- a/src/lib/libcrypto/bio/bio_cb.c +++ b/src/lib/libcrypto/bio/bio_cb.c | |||
| @@ -63,81 +63,85 @@ | |||
| 63 | #include <openssl/bio.h> | 63 | #include <openssl/bio.h> |
| 64 | #include <openssl/err.h> | 64 | #include <openssl/err.h> |
| 65 | 65 | ||
| 66 | long BIO_debug_callback(BIO *bio, int cmd, const char *argp, | 66 | long |
| 67 | int argi, long argl, long ret) | 67 | BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi, long argl, |
| 68 | { | 68 | long ret) |
| 69 | { | ||
| 69 | BIO *b; | 70 | BIO *b; |
| 70 | char buf[256]; | 71 | char buf[256]; |
| 71 | char *p; | 72 | char *p; |
| 72 | long r=1; | 73 | long r = 1; |
| 73 | size_t p_maxlen; | 74 | size_t p_maxlen; |
| 74 | 75 | ||
| 75 | if (BIO_CB_RETURN & cmd) | 76 | if (BIO_CB_RETURN & cmd) |
| 76 | r=ret; | 77 | r = ret; |
| 77 | 78 | ||
| 78 | (void) snprintf(buf,sizeof buf,"BIO[%08lX]:",(unsigned long)bio); | 79 | (void) snprintf(buf, sizeof buf, "BIO[%08lX]:", (unsigned long)bio); |
| 79 | p= &(buf[14]); | 80 | p = &(buf[14]); |
| 80 | p_maxlen = sizeof buf - 14; | 81 | p_maxlen = sizeof buf - 14; |
| 81 | switch (cmd) | 82 | switch (cmd) { |
| 82 | { | ||
| 83 | case BIO_CB_FREE: | 83 | case BIO_CB_FREE: |
| 84 | (void) snprintf(p,p_maxlen,"Free - %s\n",bio->method->name); | 84 | (void) snprintf(p, p_maxlen, "Free - %s\n", bio->method->name); |
| 85 | break; | 85 | break; |
| 86 | case BIO_CB_READ: | 86 | case BIO_CB_READ: |
| 87 | if (bio->method->type & BIO_TYPE_DESCRIPTOR) | 87 | if (bio->method->type & BIO_TYPE_DESCRIPTOR) |
| 88 | (void) snprintf(p,p_maxlen,"read(%d,%lu) - %s fd=%d\n", | 88 | (void) snprintf(p, p_maxlen, |
| 89 | bio->num,(unsigned long)argi, | 89 | "read(%d,%lu) - %s fd=%d\n", |
| 90 | bio->method->name,bio->num); | 90 | bio->num,(unsigned long)argi, |
| 91 | bio->method->name, bio->num); | ||
| 91 | else | 92 | else |
| 92 | (void) snprintf(p,p_maxlen,"read(%d,%lu) - %s\n", | 93 | (void) snprintf(p, p_maxlen, "read(%d,%lu) - %s\n", |
| 93 | bio->num,(unsigned long)argi, | 94 | bio->num, (unsigned long)argi, bio->method->name); |
| 94 | bio->method->name); | ||
| 95 | break; | 95 | break; |
| 96 | case BIO_CB_WRITE: | 96 | case BIO_CB_WRITE: |
| 97 | if (bio->method->type & BIO_TYPE_DESCRIPTOR) | 97 | if (bio->method->type & BIO_TYPE_DESCRIPTOR) |
| 98 | (void) snprintf(p,p_maxlen,"write(%d,%lu) - %s fd=%d\n", | 98 | (void) snprintf(p, p_maxlen, |
| 99 | bio->num,(unsigned long)argi, | 99 | "write(%d,%lu) - %s fd=%d\n", |
| 100 | bio->method->name,bio->num); | 100 | bio->num, (unsigned long)argi, |
| 101 | bio->method->name, bio->num); | ||
| 101 | else | 102 | else |
| 102 | (void) snprintf(p,p_maxlen,"write(%d,%lu) - %s\n", | 103 | (void) snprintf(p, p_maxlen, "write(%d,%lu) - %s\n", |
| 103 | bio->num,(unsigned long)argi, | 104 | bio->num, (unsigned long)argi, bio->method->name); |
| 104 | bio->method->name); | ||
| 105 | break; | 105 | break; |
| 106 | case BIO_CB_PUTS: | 106 | case BIO_CB_PUTS: |
| 107 | (void) snprintf(p,p_maxlen,"puts() - %s\n",bio->method->name); | 107 | (void) snprintf(p, p_maxlen, |
| 108 | "puts() - %s\n", bio->method->name); | ||
| 108 | break; | 109 | break; |
| 109 | case BIO_CB_GETS: | 110 | case BIO_CB_GETS: |
| 110 | (void) snprintf(p,p_maxlen,"gets(%lu) - %s\n",(unsigned long)argi,bio->method->name); | 111 | (void) snprintf(p, p_maxlen, "gets(%lu) - %s\n", |
| 112 | (unsigned long)argi, bio->method->name); | ||
| 111 | break; | 113 | break; |
| 112 | case BIO_CB_CTRL: | 114 | case BIO_CB_CTRL: |
| 113 | (void) snprintf(p,p_maxlen,"ctrl(%lu) - %s\n",(unsigned long)argi,bio->method->name); | 115 | (void) snprintf(p, p_maxlen, "ctrl(%lu) - %s\n", |
| 116 | (unsigned long)argi, bio->method->name); | ||
| 114 | break; | 117 | break; |
| 115 | case BIO_CB_RETURN|BIO_CB_READ: | 118 | case BIO_CB_RETURN|BIO_CB_READ: |
| 116 | (void) snprintf(p,p_maxlen,"read return %ld\n",ret); | 119 | (void) snprintf(p, p_maxlen, "read return %ld\n", ret); |
| 117 | break; | 120 | break; |
| 118 | case BIO_CB_RETURN|BIO_CB_WRITE: | 121 | case BIO_CB_RETURN|BIO_CB_WRITE: |
| 119 | (void) snprintf(p,p_maxlen,"write return %ld\n",ret); | 122 | (void) snprintf(p, p_maxlen, "write return %ld\n", ret); |
| 120 | break; | 123 | break; |
| 121 | case BIO_CB_RETURN|BIO_CB_GETS: | 124 | case BIO_CB_RETURN|BIO_CB_GETS: |
| 122 | (void) snprintf(p,p_maxlen,"gets return %ld\n",ret); | 125 | (void) snprintf(p, p_maxlen, "gets return %ld\n", ret); |
| 123 | break; | 126 | break; |
| 124 | case BIO_CB_RETURN|BIO_CB_PUTS: | 127 | case BIO_CB_RETURN|BIO_CB_PUTS: |
| 125 | (void) snprintf(p,p_maxlen,"puts return %ld\n",ret); | 128 | (void) snprintf(p, p_maxlen, "puts return %ld\n", ret); |
| 126 | break; | 129 | break; |
| 127 | case BIO_CB_RETURN|BIO_CB_CTRL: | 130 | case BIO_CB_RETURN|BIO_CB_CTRL: |
| 128 | (void) snprintf(p,p_maxlen,"ctrl return %ld\n",ret); | 131 | (void) snprintf(p, p_maxlen, "ctrl return %ld\n", ret); |
| 129 | break; | 132 | break; |
| 130 | default: | 133 | default: |
| 131 | (void) snprintf(p,p_maxlen,"bio callback - unknown type (%d)\n",cmd); | 134 | (void) snprintf(p, p_maxlen, |
| 135 | "bio callback - unknown type (%d)\n", cmd); | ||
| 132 | break; | 136 | break; |
| 133 | } | 137 | } |
| 134 | 138 | ||
| 135 | b=(BIO *)bio->cb_arg; | 139 | b = (BIO *)bio->cb_arg; |
| 136 | if (b != NULL) | 140 | if (b != NULL) |
| 137 | BIO_write(b,buf,strlen(buf)); | 141 | BIO_write(b, buf, strlen(buf)); |
| 138 | #if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16) | 142 | #if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16) |
| 139 | else | 143 | else |
| 140 | fputs(buf,stderr); | 144 | fputs(buf, stderr); |
| 141 | #endif | 145 | #endif |
| 142 | return(r); | 146 | return (r); |
| 143 | } | 147 | } |
diff --git a/src/lib/libcrypto/bio/bio_err.c b/src/lib/libcrypto/bio/bio_err.c index 0dbfbd80d3..86e9a3082b 100644 --- a/src/lib/libcrypto/bio/bio_err.c +++ b/src/lib/libcrypto/bio/bio_err.c | |||
| @@ -68,88 +68,85 @@ | |||
| 68 | #define ERR_FUNC(func) ERR_PACK(ERR_LIB_BIO,func,0) | 68 | #define ERR_FUNC(func) ERR_PACK(ERR_LIB_BIO,func,0) |
| 69 | #define ERR_REASON(reason) ERR_PACK(ERR_LIB_BIO,0,reason) | 69 | #define ERR_REASON(reason) ERR_PACK(ERR_LIB_BIO,0,reason) |
| 70 | 70 | ||
| 71 | static ERR_STRING_DATA BIO_str_functs[]= | 71 | static ERR_STRING_DATA BIO_str_functs[]= { |
| 72 | { | 72 | {ERR_FUNC(BIO_F_ACPT_STATE), "ACPT_STATE"}, |
| 73 | {ERR_FUNC(BIO_F_ACPT_STATE), "ACPT_STATE"}, | 73 | {ERR_FUNC(BIO_F_BIO_ACCEPT), "BIO_accept"}, |
| 74 | {ERR_FUNC(BIO_F_BIO_ACCEPT), "BIO_accept"}, | 74 | {ERR_FUNC(BIO_F_BIO_BER_GET_HEADER), "BIO_BER_GET_HEADER"}, |
| 75 | {ERR_FUNC(BIO_F_BIO_BER_GET_HEADER), "BIO_BER_GET_HEADER"}, | 75 | {ERR_FUNC(BIO_F_BIO_CALLBACK_CTRL), "BIO_callback_ctrl"}, |
| 76 | {ERR_FUNC(BIO_F_BIO_CALLBACK_CTRL), "BIO_callback_ctrl"}, | 76 | {ERR_FUNC(BIO_F_BIO_CTRL), "BIO_ctrl"}, |
| 77 | {ERR_FUNC(BIO_F_BIO_CTRL), "BIO_ctrl"}, | 77 | {ERR_FUNC(BIO_F_BIO_GETHOSTBYNAME), "BIO_gethostbyname"}, |
| 78 | {ERR_FUNC(BIO_F_BIO_GETHOSTBYNAME), "BIO_gethostbyname"}, | 78 | {ERR_FUNC(BIO_F_BIO_GETS), "BIO_gets"}, |
| 79 | {ERR_FUNC(BIO_F_BIO_GETS), "BIO_gets"}, | 79 | {ERR_FUNC(BIO_F_BIO_GET_ACCEPT_SOCKET), "BIO_get_accept_socket"}, |
| 80 | {ERR_FUNC(BIO_F_BIO_GET_ACCEPT_SOCKET), "BIO_get_accept_socket"}, | 80 | {ERR_FUNC(BIO_F_BIO_GET_HOST_IP), "BIO_get_host_ip"}, |
| 81 | {ERR_FUNC(BIO_F_BIO_GET_HOST_IP), "BIO_get_host_ip"}, | 81 | {ERR_FUNC(BIO_F_BIO_GET_PORT), "BIO_get_port"}, |
| 82 | {ERR_FUNC(BIO_F_BIO_GET_PORT), "BIO_get_port"}, | 82 | {ERR_FUNC(BIO_F_BIO_MAKE_PAIR), "BIO_MAKE_PAIR"}, |
| 83 | {ERR_FUNC(BIO_F_BIO_MAKE_PAIR), "BIO_MAKE_PAIR"}, | 83 | {ERR_FUNC(BIO_F_BIO_NEW), "BIO_new"}, |
| 84 | {ERR_FUNC(BIO_F_BIO_NEW), "BIO_new"}, | 84 | {ERR_FUNC(BIO_F_BIO_NEW_FILE), "BIO_new_file"}, |
| 85 | {ERR_FUNC(BIO_F_BIO_NEW_FILE), "BIO_new_file"}, | 85 | {ERR_FUNC(BIO_F_BIO_NEW_MEM_BUF), "BIO_new_mem_buf"}, |
| 86 | {ERR_FUNC(BIO_F_BIO_NEW_MEM_BUF), "BIO_new_mem_buf"}, | 86 | {ERR_FUNC(BIO_F_BIO_NREAD), "BIO_nread"}, |
| 87 | {ERR_FUNC(BIO_F_BIO_NREAD), "BIO_nread"}, | 87 | {ERR_FUNC(BIO_F_BIO_NREAD0), "BIO_nread0"}, |
| 88 | {ERR_FUNC(BIO_F_BIO_NREAD0), "BIO_nread0"}, | 88 | {ERR_FUNC(BIO_F_BIO_NWRITE), "BIO_nwrite"}, |
| 89 | {ERR_FUNC(BIO_F_BIO_NWRITE), "BIO_nwrite"}, | 89 | {ERR_FUNC(BIO_F_BIO_NWRITE0), "BIO_nwrite0"}, |
| 90 | {ERR_FUNC(BIO_F_BIO_NWRITE0), "BIO_nwrite0"}, | 90 | {ERR_FUNC(BIO_F_BIO_PUTS), "BIO_puts"}, |
| 91 | {ERR_FUNC(BIO_F_BIO_PUTS), "BIO_puts"}, | 91 | {ERR_FUNC(BIO_F_BIO_READ), "BIO_read"}, |
| 92 | {ERR_FUNC(BIO_F_BIO_READ), "BIO_read"}, | 92 | {ERR_FUNC(BIO_F_BIO_SOCK_INIT), "BIO_sock_init"}, |
| 93 | {ERR_FUNC(BIO_F_BIO_SOCK_INIT), "BIO_sock_init"}, | 93 | {ERR_FUNC(BIO_F_BIO_WRITE), "BIO_write"}, |
| 94 | {ERR_FUNC(BIO_F_BIO_WRITE), "BIO_write"}, | 94 | {ERR_FUNC(BIO_F_BUFFER_CTRL), "BUFFER_CTRL"}, |
| 95 | {ERR_FUNC(BIO_F_BUFFER_CTRL), "BUFFER_CTRL"}, | 95 | {ERR_FUNC(BIO_F_CONN_CTRL), "CONN_CTRL"}, |
| 96 | {ERR_FUNC(BIO_F_CONN_CTRL), "CONN_CTRL"}, | 96 | {ERR_FUNC(BIO_F_CONN_STATE), "CONN_STATE"}, |
| 97 | {ERR_FUNC(BIO_F_CONN_STATE), "CONN_STATE"}, | 97 | {ERR_FUNC(BIO_F_DGRAM_SCTP_READ), "DGRAM_SCTP_READ"}, |
| 98 | {ERR_FUNC(BIO_F_DGRAM_SCTP_READ), "DGRAM_SCTP_READ"}, | 98 | {ERR_FUNC(BIO_F_FILE_CTRL), "FILE_CTRL"}, |
| 99 | {ERR_FUNC(BIO_F_FILE_CTRL), "FILE_CTRL"}, | 99 | {ERR_FUNC(BIO_F_FILE_READ), "FILE_READ"}, |
| 100 | {ERR_FUNC(BIO_F_FILE_READ), "FILE_READ"}, | 100 | {ERR_FUNC(BIO_F_LINEBUFFER_CTRL), "LINEBUFFER_CTRL"}, |
| 101 | {ERR_FUNC(BIO_F_LINEBUFFER_CTRL), "LINEBUFFER_CTRL"}, | 101 | {ERR_FUNC(BIO_F_MEM_READ), "MEM_READ"}, |
| 102 | {ERR_FUNC(BIO_F_MEM_READ), "MEM_READ"}, | 102 | {ERR_FUNC(BIO_F_MEM_WRITE), "MEM_WRITE"}, |
| 103 | {ERR_FUNC(BIO_F_MEM_WRITE), "MEM_WRITE"}, | 103 | {ERR_FUNC(BIO_F_SSL_NEW), "SSL_new"}, |
| 104 | {ERR_FUNC(BIO_F_SSL_NEW), "SSL_new"}, | 104 | {ERR_FUNC(BIO_F_WSASTARTUP), "WSASTARTUP"}, |
| 105 | {ERR_FUNC(BIO_F_WSASTARTUP), "WSASTARTUP"}, | 105 | {0, NULL} |
| 106 | {0,NULL} | 106 | }; |
| 107 | }; | ||
| 108 | 107 | ||
| 109 | static ERR_STRING_DATA BIO_str_reasons[]= | 108 | static ERR_STRING_DATA BIO_str_reasons[]= { |
| 110 | { | 109 | {ERR_REASON(BIO_R_ACCEPT_ERROR) , "accept error"}, |
| 111 | {ERR_REASON(BIO_R_ACCEPT_ERROR) ,"accept error"}, | 110 | {ERR_REASON(BIO_R_BAD_FOPEN_MODE) , "bad fopen mode"}, |
| 112 | {ERR_REASON(BIO_R_BAD_FOPEN_MODE) ,"bad fopen mode"}, | 111 | {ERR_REASON(BIO_R_BAD_HOSTNAME_LOOKUP) , "bad hostname lookup"}, |
| 113 | {ERR_REASON(BIO_R_BAD_HOSTNAME_LOOKUP) ,"bad hostname lookup"}, | 112 | {ERR_REASON(BIO_R_BROKEN_PIPE) , "broken pipe"}, |
| 114 | {ERR_REASON(BIO_R_BROKEN_PIPE) ,"broken pipe"}, | 113 | {ERR_REASON(BIO_R_CONNECT_ERROR) , "connect error"}, |
| 115 | {ERR_REASON(BIO_R_CONNECT_ERROR) ,"connect error"}, | 114 | {ERR_REASON(BIO_R_EOF_ON_MEMORY_BIO) , "EOF on memory BIO"}, |
| 116 | {ERR_REASON(BIO_R_EOF_ON_MEMORY_BIO) ,"EOF on memory BIO"}, | 115 | {ERR_REASON(BIO_R_ERROR_SETTING_NBIO) , "error setting nbio"}, |
| 117 | {ERR_REASON(BIO_R_ERROR_SETTING_NBIO) ,"error setting nbio"}, | 116 | {ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET), "error setting nbio on accepted socket"}, |
| 118 | {ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET),"error setting nbio on accepted socket"}, | 117 | {ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET), "error setting nbio on accept socket"}, |
| 119 | {ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET),"error setting nbio on accept socket"}, | 118 | {ERR_REASON(BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET), "gethostbyname addr is not af inet"}, |
| 120 | {ERR_REASON(BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET),"gethostbyname addr is not af inet"}, | 119 | {ERR_REASON(BIO_R_INVALID_ARGUMENT) , "invalid argument"}, |
| 121 | {ERR_REASON(BIO_R_INVALID_ARGUMENT) ,"invalid argument"}, | 120 | {ERR_REASON(BIO_R_INVALID_IP_ADDRESS) , "invalid ip address"}, |
| 122 | {ERR_REASON(BIO_R_INVALID_IP_ADDRESS) ,"invalid ip address"}, | 121 | {ERR_REASON(BIO_R_IN_USE) , "in use"}, |
| 123 | {ERR_REASON(BIO_R_IN_USE) ,"in use"}, | 122 | {ERR_REASON(BIO_R_KEEPALIVE) , "keepalive"}, |
| 124 | {ERR_REASON(BIO_R_KEEPALIVE) ,"keepalive"}, | 123 | {ERR_REASON(BIO_R_NBIO_CONNECT_ERROR) , "nbio connect error"}, |
| 125 | {ERR_REASON(BIO_R_NBIO_CONNECT_ERROR) ,"nbio connect error"}, | 124 | {ERR_REASON(BIO_R_NO_ACCEPT_PORT_SPECIFIED), "no accept port specified"}, |
| 126 | {ERR_REASON(BIO_R_NO_ACCEPT_PORT_SPECIFIED),"no accept port specified"}, | 125 | {ERR_REASON(BIO_R_NO_HOSTNAME_SPECIFIED) , "no hostname specified"}, |
| 127 | {ERR_REASON(BIO_R_NO_HOSTNAME_SPECIFIED) ,"no hostname specified"}, | 126 | {ERR_REASON(BIO_R_NO_PORT_DEFINED) , "no port defined"}, |
| 128 | {ERR_REASON(BIO_R_NO_PORT_DEFINED) ,"no port defined"}, | 127 | {ERR_REASON(BIO_R_NO_PORT_SPECIFIED) , "no port specified"}, |
| 129 | {ERR_REASON(BIO_R_NO_PORT_SPECIFIED) ,"no port specified"}, | 128 | {ERR_REASON(BIO_R_NO_SUCH_FILE) , "no such file"}, |
| 130 | {ERR_REASON(BIO_R_NO_SUCH_FILE) ,"no such file"}, | 129 | {ERR_REASON(BIO_R_NULL_PARAMETER) , "null parameter"}, |
| 131 | {ERR_REASON(BIO_R_NULL_PARAMETER) ,"null parameter"}, | 130 | {ERR_REASON(BIO_R_TAG_MISMATCH) , "tag mismatch"}, |
| 132 | {ERR_REASON(BIO_R_TAG_MISMATCH) ,"tag mismatch"}, | 131 | {ERR_REASON(BIO_R_UNABLE_TO_BIND_SOCKET) , "unable to bind socket"}, |
| 133 | {ERR_REASON(BIO_R_UNABLE_TO_BIND_SOCKET) ,"unable to bind socket"}, | 132 | {ERR_REASON(BIO_R_UNABLE_TO_CREATE_SOCKET), "unable to create socket"}, |
| 134 | {ERR_REASON(BIO_R_UNABLE_TO_CREATE_SOCKET),"unable to create socket"}, | 133 | {ERR_REASON(BIO_R_UNABLE_TO_LISTEN_SOCKET), "unable to listen socket"}, |
| 135 | {ERR_REASON(BIO_R_UNABLE_TO_LISTEN_SOCKET),"unable to listen socket"}, | 134 | {ERR_REASON(BIO_R_UNINITIALIZED) , "uninitialized"}, |
| 136 | {ERR_REASON(BIO_R_UNINITIALIZED) ,"uninitialized"}, | 135 | {ERR_REASON(BIO_R_UNSUPPORTED_METHOD) , "unsupported method"}, |
| 137 | {ERR_REASON(BIO_R_UNSUPPORTED_METHOD) ,"unsupported method"}, | 136 | {ERR_REASON(BIO_R_WRITE_TO_READ_ONLY_BIO), "write to read only BIO"}, |
| 138 | {ERR_REASON(BIO_R_WRITE_TO_READ_ONLY_BIO),"write to read only BIO"}, | 137 | {ERR_REASON(BIO_R_WSASTARTUP) , "WSAStartup"}, |
| 139 | {ERR_REASON(BIO_R_WSASTARTUP) ,"WSAStartup"}, | 138 | {0, NULL} |
| 140 | {0,NULL} | 139 | }; |
| 141 | }; | ||
| 142 | 140 | ||
| 143 | #endif | 141 | #endif |
| 144 | 142 | ||
| 145 | void ERR_load_BIO_strings(void) | 143 | void |
| 146 | { | 144 | ERR_load_BIO_strings(void) |
| 145 | { | ||
| 147 | #ifndef OPENSSL_NO_ERR | 146 | #ifndef OPENSSL_NO_ERR |
| 148 | 147 | if (ERR_func_error_string(BIO_str_functs[0].error) == NULL) { | |
| 149 | if (ERR_func_error_string(BIO_str_functs[0].error) == NULL) | 148 | ERR_load_strings(0, BIO_str_functs); |
| 150 | { | 149 | ERR_load_strings(0, BIO_str_reasons); |
| 151 | ERR_load_strings(0,BIO_str_functs); | ||
| 152 | ERR_load_strings(0,BIO_str_reasons); | ||
| 153 | } | ||
| 154 | #endif | ||
| 155 | } | 150 | } |
| 151 | #endif | ||
| 152 | } | ||
diff --git a/src/lib/libcrypto/bio/bio_lib.c b/src/lib/libcrypto/bio/bio_lib.c index 9c9646afa8..9e8fb7913a 100644 --- a/src/lib/libcrypto/bio/bio_lib.c +++ b/src/lib/libcrypto/bio/bio_lib.c | |||
| @@ -63,539 +63,571 @@ | |||
| 63 | #include <openssl/bio.h> | 63 | #include <openssl/bio.h> |
| 64 | #include <openssl/stack.h> | 64 | #include <openssl/stack.h> |
| 65 | 65 | ||
| 66 | BIO *BIO_new(BIO_METHOD *method) | 66 | BIO |
| 67 | { | 67 | *BIO_new(BIO_METHOD *method) |
| 68 | BIO *ret=NULL; | 68 | { |
| 69 | 69 | BIO *ret = NULL; | |
| 70 | ret=(BIO *)OPENSSL_malloc(sizeof(BIO)); | 70 | |
| 71 | if (ret == NULL) | 71 | ret = (BIO *)OPENSSL_malloc(sizeof(BIO)); |
| 72 | { | 72 | if (ret == NULL) { |
| 73 | BIOerr(BIO_F_BIO_NEW,ERR_R_MALLOC_FAILURE); | 73 | BIOerr(BIO_F_BIO_NEW, ERR_R_MALLOC_FAILURE); |
| 74 | return(NULL); | 74 | return (NULL); |
| 75 | } | 75 | } |
| 76 | if (!BIO_set(ret,method)) | 76 | if (!BIO_set(ret, method)) { |
| 77 | { | ||
| 78 | OPENSSL_free(ret); | 77 | OPENSSL_free(ret); |
| 79 | ret=NULL; | 78 | ret = NULL; |
| 80 | } | ||
| 81 | return(ret); | ||
| 82 | } | 79 | } |
| 80 | return (ret); | ||
| 81 | } | ||
| 83 | 82 | ||
| 84 | int BIO_set(BIO *bio, BIO_METHOD *method) | 83 | int |
| 85 | { | 84 | BIO_set(BIO *bio, BIO_METHOD *method) |
| 86 | bio->method=method; | 85 | { |
| 87 | bio->callback=NULL; | 86 | bio->method = method; |
| 88 | bio->cb_arg=NULL; | 87 | bio->callback = NULL; |
| 89 | bio->init=0; | 88 | bio->cb_arg = NULL; |
| 90 | bio->shutdown=1; | 89 | bio->init = 0; |
| 91 | bio->flags=0; | 90 | bio->shutdown = 1; |
| 92 | bio->retry_reason=0; | 91 | bio->flags = 0; |
| 93 | bio->num=0; | 92 | bio->retry_reason = 0; |
| 94 | bio->ptr=NULL; | 93 | bio->num = 0; |
| 95 | bio->prev_bio=NULL; | 94 | bio->ptr = NULL; |
| 96 | bio->next_bio=NULL; | 95 | bio->prev_bio = NULL; |
| 97 | bio->references=1; | 96 | bio->next_bio = NULL; |
| 98 | bio->num_read=0L; | 97 | bio->references = 1; |
| 99 | bio->num_write=0L; | 98 | bio->num_read = 0L; |
| 99 | bio->num_write = 0L; | ||
| 100 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data); | 100 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data); |
| 101 | if (method->create != NULL) | 101 | if (method->create != NULL) |
| 102 | if (!method->create(bio)) | 102 | if (!method->create(bio)) { |
| 103 | { | ||
| 104 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, | 103 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, |
| 105 | &bio->ex_data); | 104 | &bio->ex_data); |
| 106 | return(0); | 105 | return (0); |
| 107 | } | 106 | } |
| 108 | return(1); | 107 | return (1); |
| 109 | } | 108 | } |
| 110 | 109 | ||
| 111 | int BIO_free(BIO *a) | 110 | int |
| 112 | { | 111 | BIO_free(BIO *a) |
| 112 | { | ||
| 113 | int i; | 113 | int i; |
| 114 | 114 | ||
| 115 | if (a == NULL) return(0); | 115 | if (a == NULL) |
| 116 | return (0); | ||
| 116 | 117 | ||
| 117 | i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_BIO); | 118 | i = CRYPTO_add(&a->references, -1, CRYPTO_LOCK_BIO); |
| 118 | #ifdef REF_PRINT | 119 | #ifdef REF_PRINT |
| 119 | REF_PRINT("BIO",a); | 120 | REF_PRINT("BIO", a); |
| 120 | #endif | 121 | #endif |
| 121 | if (i > 0) return(1); | 122 | if (i > 0) |
| 123 | return (1); | ||
| 122 | #ifdef REF_CHECK | 124 | #ifdef REF_CHECK |
| 123 | if (i < 0) | 125 | if (i < 0) { |
| 124 | { | 126 | fprintf(stderr, "BIO_free, bad reference count\n"); |
| 125 | fprintf(stderr,"BIO_free, bad reference count\n"); | ||
| 126 | abort(); | 127 | abort(); |
| 127 | } | 128 | } |
| 128 | #endif | 129 | #endif |
| 129 | if ((a->callback != NULL) && | 130 | if ((a->callback != NULL) && |
| 130 | ((i=(int)a->callback(a,BIO_CB_FREE,NULL,0,0L,1L)) <= 0)) | 131 | ((i = (int)a->callback(a, BIO_CB_FREE, NULL, 0, 0L, 1L)) <= 0)) |
| 131 | return(i); | 132 | return (i); |
| 132 | 133 | ||
| 133 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data); | 134 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data); |
| 134 | 135 | ||
| 135 | if ((a->method == NULL) || (a->method->destroy == NULL)) return(1); | 136 | if ((a->method == NULL) || (a->method->destroy == NULL)) |
| 137 | return (1); | ||
| 136 | a->method->destroy(a); | 138 | a->method->destroy(a); |
| 137 | OPENSSL_free(a); | 139 | OPENSSL_free(a); |
| 138 | return(1); | 140 | return (1); |
| 139 | } | 141 | } |
| 140 | 142 | ||
| 141 | void BIO_vfree(BIO *a) | 143 | void |
| 142 | { BIO_free(a); } | 144 | BIO_vfree(BIO *a) |
| 145 | { | ||
| 146 | BIO_free(a); | ||
| 147 | } | ||
| 143 | 148 | ||
| 144 | void BIO_clear_flags(BIO *b, int flags) | 149 | void |
| 145 | { | 150 | BIO_clear_flags(BIO *b, int flags) |
| 151 | { | ||
| 146 | b->flags &= ~flags; | 152 | b->flags &= ~flags; |
| 147 | } | 153 | } |
| 148 | 154 | ||
| 149 | int BIO_test_flags(const BIO *b, int flags) | 155 | int |
| 150 | { | 156 | BIO_test_flags(const BIO *b, int flags) |
| 157 | { | ||
| 151 | return (b->flags & flags); | 158 | return (b->flags & flags); |
| 152 | } | 159 | } |
| 153 | 160 | ||
| 154 | void BIO_set_flags(BIO *b, int flags) | 161 | void |
| 155 | { | 162 | BIO_set_flags(BIO *b, int flags) |
| 163 | { | ||
| 156 | b->flags |= flags; | 164 | b->flags |= flags; |
| 157 | } | 165 | } |
| 158 | 166 | ||
| 159 | long (*BIO_get_callback(const BIO *b))(struct bio_st *,int,const char *,int, long,long) | 167 | long |
| 160 | { | 168 | (*BIO_get_callback(const BIO *b))(struct bio_st *, int, const char *, int, |
| 169 | long, long) | ||
| 170 | { | ||
| 161 | return b->callback; | 171 | return b->callback; |
| 162 | } | 172 | } |
| 163 | 173 | ||
| 164 | void BIO_set_callback(BIO *b, long (*cb)(struct bio_st *,int,const char *,int, long,long)) | 174 | void |
| 165 | { | 175 | BIO_set_callback(BIO *b, long (*cb)(struct bio_st *, int, const char *, int, |
| 176 | long, long)) | ||
| 177 | { | ||
| 166 | b->callback = cb; | 178 | b->callback = cb; |
| 167 | } | 179 | } |
| 168 | 180 | ||
| 169 | void BIO_set_callback_arg(BIO *b, char *arg) | 181 | void |
| 170 | { | 182 | BIO_set_callback_arg(BIO *b, char *arg) |
| 183 | { | ||
| 171 | b->cb_arg = arg; | 184 | b->cb_arg = arg; |
| 172 | } | 185 | } |
| 173 | 186 | ||
| 174 | char * BIO_get_callback_arg(const BIO *b) | 187 | char * |
| 175 | { | 188 | BIO_get_callback_arg(const BIO *b) |
| 189 | { | ||
| 176 | return b->cb_arg; | 190 | return b->cb_arg; |
| 177 | } | 191 | } |
| 178 | 192 | ||
| 179 | const char * BIO_method_name(const BIO *b) | 193 | const char * |
| 180 | { | 194 | BIO_method_name(const BIO *b) |
| 195 | { | ||
| 181 | return b->method->name; | 196 | return b->method->name; |
| 182 | } | 197 | } |
| 183 | 198 | ||
| 184 | int BIO_method_type(const BIO *b) | 199 | int |
| 185 | { | 200 | BIO_method_type(const BIO *b) |
| 201 | { | ||
| 186 | return b->method->type; | 202 | return b->method->type; |
| 187 | } | 203 | } |
| 188 | |||
| 189 | 204 | ||
| 190 | int BIO_read(BIO *b, void *out, int outl) | 205 | int |
| 191 | { | 206 | BIO_read(BIO *b, void *out, int outl) |
| 207 | { | ||
| 192 | int i; | 208 | int i; |
| 193 | long (*cb)(BIO *,int,const char *,int,long,long); | 209 | long (*cb)(BIO *, int, const char *, int, long, long); |
| 194 | 210 | ||
| 195 | if ((b == NULL) || (b->method == NULL) || (b->method->bread == NULL)) | 211 | if ((b == NULL) || (b->method == NULL) || (b->method->bread == NULL)) { |
| 196 | { | 212 | BIOerr(BIO_F_BIO_READ, BIO_R_UNSUPPORTED_METHOD); |
| 197 | BIOerr(BIO_F_BIO_READ,BIO_R_UNSUPPORTED_METHOD); | 213 | return (-2); |
| 198 | return(-2); | 214 | } |
| 199 | } | ||
| 200 | 215 | ||
| 201 | cb=b->callback; | 216 | cb = b->callback; |
| 202 | if ((cb != NULL) && | 217 | if ((cb != NULL) && |
| 203 | ((i=(int)cb(b,BIO_CB_READ,out,outl,0L,1L)) <= 0)) | 218 | ((i = (int)cb(b, BIO_CB_READ, out, outl, 0L, 1L)) <= 0)) |
| 204 | return(i); | 219 | return (i); |
| 205 | 220 | ||
| 206 | if (!b->init) | 221 | if (!b->init) { |
| 207 | { | 222 | BIOerr(BIO_F_BIO_READ, BIO_R_UNINITIALIZED); |
| 208 | BIOerr(BIO_F_BIO_READ,BIO_R_UNINITIALIZED); | 223 | return (-2); |
| 209 | return(-2); | 224 | } |
| 210 | } | ||
| 211 | 225 | ||
| 212 | i=b->method->bread(b,out,outl); | 226 | i = b->method->bread(b, out, outl); |
| 213 | 227 | ||
| 214 | if (i > 0) b->num_read+=(unsigned long)i; | 228 | if (i > 0) |
| 229 | b->num_read += (unsigned long)i; | ||
| 215 | 230 | ||
| 216 | if (cb != NULL) | 231 | if (cb != NULL) |
| 217 | i=(int)cb(b,BIO_CB_READ|BIO_CB_RETURN,out,outl, | 232 | i = (int)cb(b, BIO_CB_READ|BIO_CB_RETURN, out, outl, |
| 218 | 0L,(long)i); | 233 | 0L, (long)i); |
| 219 | return(i); | 234 | return (i); |
| 220 | } | 235 | } |
| 221 | 236 | ||
| 222 | int BIO_write(BIO *b, const void *in, int inl) | 237 | int |
| 223 | { | 238 | BIO_write(BIO *b, const void *in, int inl) |
| 239 | { | ||
| 224 | int i; | 240 | int i; |
| 225 | long (*cb)(BIO *,int,const char *,int,long,long); | 241 | long (*cb)(BIO *, int, const char *, int, long, long); |
| 226 | 242 | ||
| 227 | if (b == NULL) | 243 | if (b == NULL) |
| 228 | return(0); | 244 | return (0); |
| 229 | 245 | ||
| 230 | cb=b->callback; | 246 | cb = b->callback; |
| 231 | if ((b->method == NULL) || (b->method->bwrite == NULL)) | 247 | if ((b->method == NULL) || (b->method->bwrite == NULL)) { |
| 232 | { | 248 | BIOerr(BIO_F_BIO_WRITE, BIO_R_UNSUPPORTED_METHOD); |
| 233 | BIOerr(BIO_F_BIO_WRITE,BIO_R_UNSUPPORTED_METHOD); | 249 | return (-2); |
| 234 | return(-2); | 250 | } |
| 235 | } | ||
| 236 | 251 | ||
| 237 | if ((cb != NULL) && | 252 | if ((cb != NULL) && |
| 238 | ((i=(int)cb(b,BIO_CB_WRITE,in,inl,0L,1L)) <= 0)) | 253 | ((i = (int)cb(b, BIO_CB_WRITE, in, inl, 0L, 1L)) <= 0)) |
| 239 | return(i); | 254 | return (i); |
| 240 | 255 | ||
| 241 | if (!b->init) | 256 | if (!b->init) { |
| 242 | { | 257 | BIOerr(BIO_F_BIO_WRITE, BIO_R_UNINITIALIZED); |
| 243 | BIOerr(BIO_F_BIO_WRITE,BIO_R_UNINITIALIZED); | 258 | return (-2); |
| 244 | return(-2); | 259 | } |
| 245 | } | ||
| 246 | 260 | ||
| 247 | i=b->method->bwrite(b,in,inl); | 261 | i = b->method->bwrite(b, in, inl); |
| 248 | 262 | ||
| 249 | if (i > 0) b->num_write+=(unsigned long)i; | 263 | if (i > 0) |
| 264 | b->num_write += (unsigned long)i; | ||
| 250 | 265 | ||
| 251 | if (cb != NULL) | 266 | if (cb != NULL) |
| 252 | i=(int)cb(b,BIO_CB_WRITE|BIO_CB_RETURN,in,inl, | 267 | i = (int)cb(b, BIO_CB_WRITE|BIO_CB_RETURN, in, inl, |
| 253 | 0L,(long)i); | 268 | 0L, (long)i); |
| 254 | return(i); | 269 | return (i); |
| 255 | } | 270 | } |
| 256 | 271 | ||
| 257 | int BIO_puts(BIO *b, const char *in) | 272 | int |
| 258 | { | 273 | BIO_puts(BIO *b, const char *in) |
| 274 | { | ||
| 259 | int i; | 275 | int i; |
| 260 | long (*cb)(BIO *,int,const char *,int,long,long); | 276 | long (*cb)(BIO *, int, const char *, int, long, long); |
| 261 | 277 | ||
| 262 | if ((b == NULL) || (b->method == NULL) || (b->method->bputs == NULL)) | 278 | if ((b == NULL) || (b->method == NULL) || (b->method->bputs == NULL)) { |
| 263 | { | 279 | BIOerr(BIO_F_BIO_PUTS, BIO_R_UNSUPPORTED_METHOD); |
| 264 | BIOerr(BIO_F_BIO_PUTS,BIO_R_UNSUPPORTED_METHOD); | 280 | return (-2); |
| 265 | return(-2); | 281 | } |
| 266 | } | ||
| 267 | 282 | ||
| 268 | cb=b->callback; | 283 | cb = b->callback; |
| 269 | 284 | ||
| 270 | if ((cb != NULL) && | 285 | if ((cb != NULL) && |
| 271 | ((i=(int)cb(b,BIO_CB_PUTS,in,0,0L,1L)) <= 0)) | 286 | ((i = (int)cb(b, BIO_CB_PUTS, in, 0, 0L, 1L)) <= 0)) |
| 272 | return(i); | 287 | return (i); |
| 273 | 288 | ||
| 274 | if (!b->init) | 289 | if (!b->init) { |
| 275 | { | 290 | BIOerr(BIO_F_BIO_PUTS, BIO_R_UNINITIALIZED); |
| 276 | BIOerr(BIO_F_BIO_PUTS,BIO_R_UNINITIALIZED); | 291 | return (-2); |
| 277 | return(-2); | 292 | } |
| 278 | } | ||
| 279 | 293 | ||
| 280 | i=b->method->bputs(b,in); | 294 | i = b->method->bputs(b, in); |
| 281 | 295 | ||
| 282 | if (i > 0) b->num_write+=(unsigned long)i; | 296 | if (i > 0) |
| 297 | b->num_write += (unsigned long)i; | ||
| 283 | 298 | ||
| 284 | if (cb != NULL) | 299 | if (cb != NULL) |
| 285 | i=(int)cb(b,BIO_CB_PUTS|BIO_CB_RETURN,in,0, | 300 | i = (int)cb(b, BIO_CB_PUTS|BIO_CB_RETURN, in, 0, 0L, (long)i); |
| 286 | 0L,(long)i); | 301 | return (i); |
| 287 | return(i); | 302 | } |
| 288 | } | ||
| 289 | 303 | ||
| 290 | int BIO_gets(BIO *b, char *in, int inl) | 304 | int |
| 291 | { | 305 | BIO_gets(BIO *b, char *in, int inl) |
| 306 | { | ||
| 292 | int i; | 307 | int i; |
| 293 | long (*cb)(BIO *,int,const char *,int,long,long); | 308 | long (*cb)(BIO *, int, const char *, int, long, long); |
| 294 | 309 | ||
| 295 | if ((b == NULL) || (b->method == NULL) || (b->method->bgets == NULL)) | 310 | if ((b == NULL) || (b->method == NULL) || (b->method->bgets == NULL)) { |
| 296 | { | 311 | BIOerr(BIO_F_BIO_GETS, BIO_R_UNSUPPORTED_METHOD); |
| 297 | BIOerr(BIO_F_BIO_GETS,BIO_R_UNSUPPORTED_METHOD); | 312 | return (-2); |
| 298 | return(-2); | 313 | } |
| 299 | } | ||
| 300 | 314 | ||
| 301 | cb=b->callback; | 315 | cb = b->callback; |
| 302 | 316 | ||
| 303 | if ((cb != NULL) && | 317 | if ((cb != NULL) && |
| 304 | ((i=(int)cb(b,BIO_CB_GETS,in,inl,0L,1L)) <= 0)) | 318 | ((i = (int)cb(b, BIO_CB_GETS, in, inl, 0L, 1L)) <= 0)) |
| 305 | return(i); | 319 | return (i); |
| 306 | 320 | ||
| 307 | if (!b->init) | 321 | if (!b->init) { |
| 308 | { | 322 | BIOerr(BIO_F_BIO_GETS, BIO_R_UNINITIALIZED); |
| 309 | BIOerr(BIO_F_BIO_GETS,BIO_R_UNINITIALIZED); | 323 | return (-2); |
| 310 | return(-2); | 324 | } |
| 311 | } | ||
| 312 | 325 | ||
| 313 | i=b->method->bgets(b,in,inl); | 326 | i = b->method->bgets(b, in, inl); |
| 314 | 327 | ||
| 315 | if (cb != NULL) | 328 | if (cb != NULL) |
| 316 | i=(int)cb(b,BIO_CB_GETS|BIO_CB_RETURN,in,inl, | 329 | i = (int)cb(b, BIO_CB_GETS|BIO_CB_RETURN, in, inl, 0L, (long)i); |
| 317 | 0L,(long)i); | 330 | return (i); |
| 318 | return(i); | 331 | } |
| 319 | } | ||
| 320 | 332 | ||
| 321 | int BIO_indent(BIO *b,int indent,int max) | 333 | int |
| 322 | { | 334 | BIO_indent(BIO *b, int indent, int max) |
| 323 | if(indent < 0) | 335 | { |
| 324 | indent=0; | 336 | if (indent < 0) |
| 325 | if(indent > max) | 337 | indent = 0; |
| 326 | indent=max; | 338 | if (indent > max) |
| 327 | while(indent--) | 339 | indent = max; |
| 328 | if(BIO_puts(b," ") != 1) | 340 | while (indent--) |
| 329 | return 0; | 341 | if (BIO_puts(b, " ") != 1) |
| 342 | return 0; | ||
| 330 | return 1; | 343 | return 1; |
| 331 | } | 344 | } |
| 332 | 345 | ||
| 333 | long BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg) | 346 | long |
| 334 | { | 347 | BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg) |
| 348 | { | ||
| 335 | int i; | 349 | int i; |
| 336 | 350 | ||
| 337 | i=iarg; | 351 | i = iarg; |
| 338 | return(BIO_ctrl(b,cmd,larg,(char *)&i)); | 352 | return (BIO_ctrl(b, cmd, larg,(char *)&i)); |
| 339 | } | 353 | } |
| 340 | 354 | ||
| 341 | char *BIO_ptr_ctrl(BIO *b, int cmd, long larg) | 355 | char |
| 342 | { | 356 | *BIO_ptr_ctrl(BIO *b, int cmd, long larg) |
| 343 | char *p=NULL; | 357 | { |
| 358 | char *p = NULL; | ||
| 344 | 359 | ||
| 345 | if (BIO_ctrl(b,cmd,larg,(char *)&p) <= 0) | 360 | if (BIO_ctrl(b, cmd, larg,(char *)&p) <= 0) |
| 346 | return(NULL); | 361 | return (NULL); |
| 347 | else | 362 | else |
| 348 | return(p); | 363 | return (p); |
| 349 | } | 364 | } |
| 350 | 365 | ||
| 351 | long BIO_ctrl(BIO *b, int cmd, long larg, void *parg) | 366 | long |
| 352 | { | 367 | BIO_ctrl(BIO *b, int cmd, long larg, void *parg) |
| 368 | { | ||
| 353 | long ret; | 369 | long ret; |
| 354 | long (*cb)(BIO *,int,const char *,int,long,long); | 370 | long (*cb)(BIO *, int, const char *, int, long, long); |
| 355 | 371 | ||
| 356 | if (b == NULL) return(0); | 372 | if (b == NULL) |
| 373 | return (0); | ||
| 357 | 374 | ||
| 358 | if ((b->method == NULL) || (b->method->ctrl == NULL)) | 375 | if ((b->method == NULL) || (b->method->ctrl == NULL)) { |
| 359 | { | 376 | BIOerr(BIO_F_BIO_CTRL, BIO_R_UNSUPPORTED_METHOD); |
| 360 | BIOerr(BIO_F_BIO_CTRL,BIO_R_UNSUPPORTED_METHOD); | 377 | return (-2); |
| 361 | return(-2); | 378 | } |
| 362 | } | ||
| 363 | 379 | ||
| 364 | cb=b->callback; | 380 | cb = b->callback; |
| 365 | 381 | ||
| 366 | if ((cb != NULL) && | 382 | if ((cb != NULL) && |
| 367 | ((ret=cb(b,BIO_CB_CTRL,parg,cmd,larg,1L)) <= 0)) | 383 | ((ret = cb(b, BIO_CB_CTRL, parg, cmd, larg, 1L)) <= 0)) |
| 368 | return(ret); | 384 | return (ret); |
| 369 | 385 | ||
| 370 | ret=b->method->ctrl(b,cmd,larg,parg); | 386 | ret = b->method->ctrl(b, cmd, larg, parg); |
| 371 | 387 | ||
| 372 | if (cb != NULL) | 388 | if (cb != NULL) |
| 373 | ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,parg,cmd, | 389 | ret = cb(b, BIO_CB_CTRL|BIO_CB_RETURN, parg, cmd, larg, ret); |
| 374 | larg,ret); | 390 | return (ret); |
| 375 | return(ret); | 391 | } |
| 376 | } | ||
| 377 | 392 | ||
| 378 | long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long)) | 393 | long |
| 379 | { | 394 | BIO_callback_ctrl(BIO *b, int cmd, |
| 395 | void (*fp)(struct bio_st *, int, const char *, int, long, long)) | ||
| 396 | { | ||
| 380 | long ret; | 397 | long ret; |
| 381 | long (*cb)(BIO *,int,const char *,int,long,long); | 398 | long (*cb)(BIO *, int, const char *, int, long, long); |
| 382 | 399 | ||
| 383 | if (b == NULL) return(0); | 400 | if (b == NULL) |
| 401 | return (0); | ||
| 384 | 402 | ||
| 385 | if ((b->method == NULL) || (b->method->callback_ctrl == NULL)) | 403 | if ((b->method == NULL) || (b->method->callback_ctrl == NULL)) { |
| 386 | { | 404 | BIOerr(BIO_F_BIO_CALLBACK_CTRL, BIO_R_UNSUPPORTED_METHOD); |
| 387 | BIOerr(BIO_F_BIO_CALLBACK_CTRL,BIO_R_UNSUPPORTED_METHOD); | 405 | return (-2); |
| 388 | return(-2); | 406 | } |
| 389 | } | ||
| 390 | 407 | ||
| 391 | cb=b->callback; | 408 | cb = b->callback; |
| 392 | 409 | ||
| 393 | if ((cb != NULL) && | 410 | if ((cb != NULL) && |
| 394 | ((ret=cb(b,BIO_CB_CTRL,(void *)&fp,cmd,0,1L)) <= 0)) | 411 | ((ret = cb(b, BIO_CB_CTRL,(void *)&fp, cmd, 0, 1L)) <= 0)) |
| 395 | return(ret); | 412 | return (ret); |
| 396 | 413 | ||
| 397 | ret=b->method->callback_ctrl(b,cmd,fp); | 414 | ret = b->method->callback_ctrl(b, cmd, fp); |
| 398 | 415 | ||
| 399 | if (cb != NULL) | 416 | if (cb != NULL) |
| 400 | ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp,cmd, | 417 | ret = cb(b, BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp, cmd, 0, ret); |
| 401 | 0,ret); | 418 | return (ret); |
| 402 | return(ret); | 419 | } |
| 403 | } | ||
| 404 | 420 | ||
| 405 | /* It is unfortunate to duplicate in functions what the BIO_(w)pending macros | 421 | /* It is unfortunate to duplicate in functions what the BIO_(w)pending macros |
| 406 | * do; but those macros have inappropriate return type, and for interfacing | 422 | * do; but those macros have inappropriate return type, and for interfacing |
| 407 | * from other programming languages, C macros aren't much of a help anyway. */ | 423 | * from other programming languages, C macros aren't much of a help anyway. */ |
| 408 | size_t BIO_ctrl_pending(BIO *bio) | 424 | size_t |
| 409 | { | 425 | BIO_ctrl_pending(BIO *bio) |
| 426 | { | ||
| 410 | return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL); | 427 | return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL); |
| 411 | } | 428 | } |
| 412 | 429 | ||
| 413 | size_t BIO_ctrl_wpending(BIO *bio) | 430 | size_t |
| 414 | { | 431 | BIO_ctrl_wpending(BIO *bio) |
| 432 | { | ||
| 415 | return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL); | 433 | return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL); |
| 416 | } | 434 | } |
| 417 | 435 | ||
| 418 | 436 | ||
| 419 | /* put the 'bio' on the end of b's list of operators */ | 437 | /* put the 'bio' on the end of b's list of operators */ |
| 420 | BIO *BIO_push(BIO *b, BIO *bio) | 438 | BIO |
| 421 | { | 439 | *BIO_push(BIO *b, BIO *bio) |
| 440 | { | ||
| 422 | BIO *lb; | 441 | BIO *lb; |
| 423 | 442 | ||
| 424 | if (b == NULL) return(bio); | 443 | if (b == NULL) |
| 425 | lb=b; | 444 | return (bio); |
| 445 | lb = b; | ||
| 426 | while (lb->next_bio != NULL) | 446 | while (lb->next_bio != NULL) |
| 427 | lb=lb->next_bio; | 447 | lb = lb->next_bio; |
| 428 | lb->next_bio=bio; | 448 | lb->next_bio = bio; |
| 429 | if (bio != NULL) | 449 | if (bio != NULL) |
| 430 | bio->prev_bio=lb; | 450 | bio->prev_bio = lb; |
| 431 | /* called to do internal processing */ | 451 | /* called to do internal processing */ |
| 432 | BIO_ctrl(b,BIO_CTRL_PUSH,0,lb); | 452 | BIO_ctrl(b, BIO_CTRL_PUSH, 0, lb); |
| 433 | return(b); | 453 | return (b); |
| 434 | } | 454 | } |
| 435 | 455 | ||
| 436 | /* Remove the first and return the rest */ | 456 | /* Remove the first and return the rest */ |
| 437 | BIO *BIO_pop(BIO *b) | 457 | BIO |
| 438 | { | 458 | *BIO_pop(BIO *b) |
| 459 | { | ||
| 439 | BIO *ret; | 460 | BIO *ret; |
| 440 | 461 | ||
| 441 | if (b == NULL) return(NULL); | 462 | if (b == NULL) |
| 442 | ret=b->next_bio; | 463 | return (NULL); |
| 464 | ret = b->next_bio; | ||
| 443 | 465 | ||
| 444 | BIO_ctrl(b,BIO_CTRL_POP,0,b); | 466 | BIO_ctrl(b, BIO_CTRL_POP, 0, b); |
| 445 | 467 | ||
| 446 | if (b->prev_bio != NULL) | 468 | if (b->prev_bio != NULL) |
| 447 | b->prev_bio->next_bio=b->next_bio; | 469 | b->prev_bio->next_bio = b->next_bio; |
| 448 | if (b->next_bio != NULL) | 470 | if (b->next_bio != NULL) |
| 449 | b->next_bio->prev_bio=b->prev_bio; | 471 | b->next_bio->prev_bio = b->prev_bio; |
| 450 | 472 | ||
| 451 | b->next_bio=NULL; | 473 | b->next_bio = NULL; |
| 452 | b->prev_bio=NULL; | 474 | b->prev_bio = NULL; |
| 453 | return(ret); | 475 | return (ret); |
| 454 | } | 476 | } |
| 455 | 477 | ||
| 456 | BIO *BIO_get_retry_BIO(BIO *bio, int *reason) | 478 | BIO |
| 457 | { | 479 | *BIO_get_retry_BIO(BIO *bio, int *reason) |
| 458 | BIO *b,*last; | 480 | { |
| 481 | BIO *b, *last; | ||
| 459 | 482 | ||
| 460 | b=last=bio; | 483 | b = last = bio; |
| 461 | for (;;) | 484 | for (;;) { |
| 462 | { | ||
| 463 | if (!BIO_should_retry(b)) break; | 485 | if (!BIO_should_retry(b)) break; |
| 464 | last=b; | 486 | last = b; |
| 465 | b=b->next_bio; | 487 | b = b->next_bio; |
| 466 | if (b == NULL) break; | 488 | if (b == NULL) |
| 467 | } | 489 | break; |
| 468 | if (reason != NULL) *reason=last->retry_reason; | 490 | } |
| 469 | return(last); | 491 | if (reason != NULL) |
| 470 | } | 492 | *reason = last->retry_reason; |
| 493 | return (last); | ||
| 494 | } | ||
| 471 | 495 | ||
| 472 | int BIO_get_retry_reason(BIO *bio) | 496 | int |
| 473 | { | 497 | BIO_get_retry_reason(BIO *bio) |
| 474 | return(bio->retry_reason); | 498 | { |
| 475 | } | 499 | return (bio->retry_reason); |
| 500 | } | ||
| 476 | 501 | ||
| 477 | BIO *BIO_find_type(BIO *bio, int type) | 502 | BIO |
| 478 | { | 503 | *BIO_find_type(BIO *bio, int type) |
| 479 | int mt,mask; | 504 | { |
| 480 | 505 | int mt, mask; | |
| 481 | if(!bio) return NULL; | 506 | |
| 482 | mask=type&0xff; | 507 | if (!bio) |
| 483 | do { | 508 | return NULL; |
| 484 | if (bio->method != NULL) | 509 | mask = type & 0xff; |
| 485 | { | 510 | do { |
| 486 | mt=bio->method->type; | 511 | if (bio->method != NULL) { |
| 487 | 512 | mt = bio->method->type; | |
| 488 | if (!mask) | 513 | if (!mask) { |
| 489 | { | 514 | if (mt & type) |
| 490 | if (mt & type) return(bio); | 515 | return (bio); |
| 491 | } | 516 | } else if (mt == type) |
| 492 | else if (mt == type) | 517 | return (bio); |
| 493 | return(bio); | 518 | } |
| 494 | } | 519 | bio = bio->next_bio; |
| 495 | bio=bio->next_bio; | 520 | } while (bio != NULL); |
| 496 | } while (bio != NULL); | 521 | return (NULL); |
| 497 | return(NULL); | 522 | } |
| 498 | } | ||
| 499 | 523 | ||
| 500 | BIO *BIO_next(BIO *b) | 524 | BIO |
| 501 | { | 525 | *BIO_next(BIO *b) |
| 502 | if(!b) return NULL; | 526 | { |
| 527 | if (!b) | ||
| 528 | return NULL; | ||
| 503 | return b->next_bio; | 529 | return b->next_bio; |
| 504 | } | 530 | } |
| 505 | 531 | ||
| 506 | void BIO_free_all(BIO *bio) | 532 | void |
| 507 | { | 533 | BIO_free_all(BIO *bio) |
| 534 | { | ||
| 508 | BIO *b; | 535 | BIO *b; |
| 509 | int ref; | 536 | int ref; |
| 510 | 537 | ||
| 511 | while (bio != NULL) | 538 | while (bio != NULL) { |
| 512 | { | 539 | b = bio; |
| 513 | b=bio; | 540 | ref = b->references; |
| 514 | ref=b->references; | 541 | bio = bio->next_bio; |
| 515 | bio=bio->next_bio; | ||
| 516 | BIO_free(b); | 542 | BIO_free(b); |
| 517 | /* Since ref count > 1, don't free anyone else. */ | 543 | /* Since ref count > 1, don't free anyone else. */ |
| 518 | if (ref > 1) break; | 544 | if (ref > 1) |
| 519 | } | 545 | break; |
| 520 | } | 546 | } |
| 547 | } | ||
| 521 | 548 | ||
| 522 | BIO *BIO_dup_chain(BIO *in) | 549 | BIO |
| 523 | { | 550 | *BIO_dup_chain(BIO *in) |
| 524 | BIO *ret=NULL,*eoc=NULL,*bio,*new_bio; | 551 | { |
| 552 | BIO *ret = NULL, *eoc = NULL, *bio, *new_bio; | ||
| 525 | 553 | ||
| 526 | for (bio=in; bio != NULL; bio=bio->next_bio) | 554 | for (bio = in; bio != NULL; bio = bio->next_bio) { |
| 527 | { | 555 | if ((new_bio = BIO_new(bio->method)) == NULL) goto err; |
| 528 | if ((new_bio=BIO_new(bio->method)) == NULL) goto err; | 556 | new_bio->callback = bio->callback; |
| 529 | new_bio->callback=bio->callback; | 557 | new_bio->cb_arg = bio->cb_arg; |
| 530 | new_bio->cb_arg=bio->cb_arg; | 558 | new_bio->init = bio->init; |
| 531 | new_bio->init=bio->init; | 559 | new_bio->shutdown = bio->shutdown; |
| 532 | new_bio->shutdown=bio->shutdown; | 560 | new_bio->flags = bio->flags; |
| 533 | new_bio->flags=bio->flags; | ||
| 534 | 561 | ||
| 535 | /* This will let SSL_s_sock() work with stdin/stdout */ | 562 | /* This will let SSL_s_sock() work with stdin/stdout */ |
| 536 | new_bio->num=bio->num; | 563 | new_bio->num = bio->num; |
| 537 | 564 | ||
| 538 | if (!BIO_dup_state(bio,(char *)new_bio)) | 565 | if (!BIO_dup_state(bio,(char *)new_bio)) { |
| 539 | { | ||
| 540 | BIO_free(new_bio); | 566 | BIO_free(new_bio); |
| 541 | goto err; | 567 | goto err; |
| 542 | } | 568 | } |
| 543 | 569 | ||
| 544 | /* copy app data */ | 570 | /* copy app data */ |
| 545 | if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO, &new_bio->ex_data, | 571 | if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO, |
| 546 | &bio->ex_data)) | 572 | &new_bio->ex_data, &bio->ex_data)) |
| 547 | goto err; | 573 | goto err; |
| 548 | 574 | ||
| 549 | if (ret == NULL) | 575 | if (ret == NULL) { |
| 550 | { | 576 | eoc = new_bio; |
| 551 | eoc=new_bio; | 577 | ret = eoc; |
| 552 | ret=eoc; | 578 | } else { |
| 553 | } | 579 | BIO_push(eoc, new_bio); |
| 554 | else | 580 | eoc = new_bio; |
| 555 | { | ||
| 556 | BIO_push(eoc,new_bio); | ||
| 557 | eoc=new_bio; | ||
| 558 | } | ||
| 559 | } | 581 | } |
| 560 | return(ret); | 582 | } |
| 583 | return (ret); | ||
| 561 | err: | 584 | err: |
| 562 | if (ret != NULL) | 585 | if (ret != NULL) |
| 563 | BIO_free(ret); | 586 | BIO_free(ret); |
| 564 | return(NULL); | 587 | return (NULL); |
| 565 | } | ||
| 566 | 588 | ||
| 567 | void BIO_copy_next_retry(BIO *b) | 589 | } |
| 568 | { | ||
| 569 | BIO_set_flags(b,BIO_get_retry_flags(b->next_bio)); | ||
| 570 | b->retry_reason=b->next_bio->retry_reason; | ||
| 571 | } | ||
| 572 | 590 | ||
| 573 | int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | 591 | void |
| 574 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) | 592 | BIO_copy_next_retry(BIO *b) |
| 575 | { | 593 | { |
| 594 | BIO_set_flags(b, BIO_get_retry_flags(b->next_bio)); | ||
| 595 | b->retry_reason = b->next_bio->retry_reason; | ||
| 596 | } | ||
| 597 | |||
| 598 | int | ||
| 599 | BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | ||
| 600 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) | ||
| 601 | { | ||
| 576 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, argl, argp, | 602 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, argl, argp, |
| 577 | new_func, dup_func, free_func); | 603 | new_func, dup_func, free_func); |
| 578 | } | 604 | } |
| 579 | 605 | ||
| 580 | int BIO_set_ex_data(BIO *bio, int idx, void *data) | 606 | int |
| 581 | { | 607 | BIO_set_ex_data(BIO *bio, int idx, void *data) |
| 582 | return(CRYPTO_set_ex_data(&(bio->ex_data),idx,data)); | 608 | { |
| 583 | } | 609 | return (CRYPTO_set_ex_data(&(bio->ex_data), idx, data)); |
| 610 | } | ||
| 584 | 611 | ||
| 585 | void *BIO_get_ex_data(BIO *bio, int idx) | 612 | void |
| 586 | { | 613 | *BIO_get_ex_data(BIO *bio, int idx) |
| 587 | return(CRYPTO_get_ex_data(&(bio->ex_data),idx)); | 614 | { |
| 588 | } | 615 | return (CRYPTO_get_ex_data(&(bio->ex_data), idx)); |
| 616 | } | ||
| 589 | 617 | ||
| 590 | unsigned long BIO_number_read(BIO *bio) | 618 | unsigned long |
| 619 | BIO_number_read(BIO *bio) | ||
| 591 | { | 620 | { |
| 592 | if(bio) return bio->num_read; | 621 | if (bio) |
| 622 | return bio->num_read; | ||
| 593 | return 0; | 623 | return 0; |
| 594 | } | 624 | } |
| 595 | 625 | ||
| 596 | unsigned long BIO_number_written(BIO *bio) | 626 | unsigned long |
| 627 | BIO_number_written(BIO *bio) | ||
| 597 | { | 628 | { |
| 598 | if(bio) return bio->num_write; | 629 | if (bio) |
| 630 | return bio->num_write; | ||
| 599 | return 0; | 631 | return 0; |
| 600 | } | 632 | } |
| 601 | 633 | ||
diff --git a/src/lib/libcrypto/bio/bss_acpt.c b/src/lib/libcrypto/bio/bss_acpt.c index 04bfb6fb9d..d772515d64 100644 --- a/src/lib/libcrypto/bio/bss_acpt.c +++ b/src/lib/libcrypto/bio/bss_acpt.c | |||
| @@ -75,8 +75,7 @@ | |||
| 75 | #undef FIONBIO | 75 | #undef FIONBIO |
| 76 | #endif | 76 | #endif |
| 77 | 77 | ||
| 78 | typedef struct bio_accept_st | 78 | typedef struct bio_accept_st { |
| 79 | { | ||
| 80 | int state; | 79 | int state; |
| 81 | char *param_addr; | 80 | char *param_addr; |
| 82 | 81 | ||
| @@ -90,7 +89,7 @@ typedef struct bio_accept_st | |||
| 90 | * If 2, always use SO_REUSEADDR. */ | 89 | * If 2, always use SO_REUSEADDR. */ |
| 91 | int bind_mode; | 90 | int bind_mode; |
| 92 | BIO *bio_chain; | 91 | BIO *bio_chain; |
| 93 | } BIO_ACCEPT; | 92 | } BIO_ACCEPT; |
| 94 | 93 | ||
| 95 | static int acpt_write(BIO *h, const char *buf, int num); | 94 | static int acpt_write(BIO *h, const char *buf, int num); |
| 96 | static int acpt_read(BIO *h, char *buf, int size); | 95 | static int acpt_read(BIO *h, char *buf, int size); |
| @@ -107,8 +106,7 @@ static void BIO_ACCEPT_free(BIO_ACCEPT *a); | |||
| 107 | #define ACPT_S_GET_ACCEPT_SOCKET 2 | 106 | #define ACPT_S_GET_ACCEPT_SOCKET 2 |
| 108 | #define ACPT_S_OK 3 | 107 | #define ACPT_S_OK 3 |
| 109 | 108 | ||
| 110 | static BIO_METHOD methods_acceptp= | 109 | static BIO_METHOD methods_acceptp = { |
| 111 | { | ||
| 112 | BIO_TYPE_ACCEPT, | 110 | BIO_TYPE_ACCEPT, |
| 113 | "socket accept", | 111 | "socket accept", |
| 114 | acpt_write, | 112 | acpt_write, |
| @@ -119,321 +117,313 @@ static BIO_METHOD methods_acceptp= | |||
| 119 | acpt_new, | 117 | acpt_new, |
| 120 | acpt_free, | 118 | acpt_free, |
| 121 | NULL, | 119 | NULL, |
| 122 | }; | 120 | }; |
| 123 | 121 | ||
| 124 | BIO_METHOD *BIO_s_accept(void) | 122 | BIO_METHOD |
| 125 | { | 123 | *BIO_s_accept(void) |
| 126 | return(&methods_acceptp); | 124 | { |
| 127 | } | 125 | return (&methods_acceptp); |
| 126 | } | ||
| 128 | 127 | ||
| 129 | static int acpt_new(BIO *bi) | 128 | static int |
| 130 | { | 129 | acpt_new(BIO *bi) |
| 130 | { | ||
| 131 | BIO_ACCEPT *ba; | 131 | BIO_ACCEPT *ba; |
| 132 | 132 | ||
| 133 | bi->init=0; | 133 | bi->init = 0; |
| 134 | bi->num=-1; | 134 | bi->num = -1; |
| 135 | bi->flags=0; | 135 | bi->flags = 0; |
| 136 | if ((ba=BIO_ACCEPT_new()) == NULL) | 136 | if ((ba = BIO_ACCEPT_new()) == NULL) |
| 137 | return(0); | 137 | return (0); |
| 138 | bi->ptr=(char *)ba; | 138 | bi->ptr = (char *)ba; |
| 139 | ba->state=ACPT_S_BEFORE; | 139 | ba->state = ACPT_S_BEFORE; |
| 140 | bi->shutdown=1; | 140 | bi->shutdown = 1; |
| 141 | return(1); | 141 | return (1); |
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | static BIO_ACCEPT *BIO_ACCEPT_new(void) | 144 | static BIO_ACCEPT |
| 145 | { | 145 | *BIO_ACCEPT_new(void) |
| 146 | { | ||
| 146 | BIO_ACCEPT *ret; | 147 | BIO_ACCEPT *ret; |
| 147 | 148 | ||
| 148 | if ((ret=(BIO_ACCEPT *)OPENSSL_malloc(sizeof(BIO_ACCEPT))) == NULL) | 149 | if ((ret = (BIO_ACCEPT *)OPENSSL_malloc(sizeof(BIO_ACCEPT))) == NULL) |
| 149 | return(NULL); | 150 | return (NULL); |
| 150 | 151 | ||
| 151 | memset(ret,0,sizeof(BIO_ACCEPT)); | 152 | memset(ret, 0, sizeof(BIO_ACCEPT)); |
| 152 | ret->accept_sock=-1; | 153 | ret->accept_sock = -1; |
| 153 | ret->bind_mode=BIO_BIND_NORMAL; | 154 | ret->bind_mode = BIO_BIND_NORMAL; |
| 154 | return(ret); | 155 | return (ret); |
| 155 | } | 156 | } |
| 156 | 157 | ||
| 157 | static void BIO_ACCEPT_free(BIO_ACCEPT *a) | 158 | static void |
| 158 | { | 159 | BIO_ACCEPT_free(BIO_ACCEPT *a) |
| 159 | if(a == NULL) | 160 | { |
| 160 | return; | 161 | if (a == NULL) |
| 161 | 162 | return; | |
| 162 | if (a->param_addr != NULL) OPENSSL_free(a->param_addr); | 163 | |
| 163 | if (a->addr != NULL) OPENSSL_free(a->addr); | 164 | if (a->param_addr != NULL) |
| 164 | if (a->bio_chain != NULL) BIO_free(a->bio_chain); | 165 | OPENSSL_free(a->param_addr); |
| 166 | if (a->addr != NULL) | ||
| 167 | OPENSSL_free(a->addr); | ||
| 168 | if (a->bio_chain != NULL) | ||
| 169 | BIO_free(a->bio_chain); | ||
| 165 | OPENSSL_free(a); | 170 | OPENSSL_free(a); |
| 166 | } | 171 | } |
| 167 | 172 | ||
| 168 | static void acpt_close_socket(BIO *bio) | 173 | static void |
| 169 | { | 174 | acpt_close_socket(BIO *bio) |
| 175 | { | ||
| 170 | BIO_ACCEPT *c; | 176 | BIO_ACCEPT *c; |
| 171 | 177 | ||
| 172 | c=(BIO_ACCEPT *)bio->ptr; | 178 | c = (BIO_ACCEPT *)bio->ptr; |
| 173 | if (c->accept_sock != -1) | 179 | if (c->accept_sock != -1) { |
| 174 | { | ||
| 175 | shutdown(c->accept_sock, SHUT_RDWR); | 180 | shutdown(c->accept_sock, SHUT_RDWR); |
| 176 | close(c->accept_sock); | 181 | close(c->accept_sock); |
| 177 | c->accept_sock=-1; | 182 | c->accept_sock = -1; |
| 178 | bio->num=-1; | 183 | bio->num = -1; |
| 179 | } | ||
| 180 | } | 184 | } |
| 185 | } | ||
| 181 | 186 | ||
| 182 | static int acpt_free(BIO *a) | 187 | static int |
| 183 | { | 188 | acpt_free(BIO *a) |
| 189 | { | ||
| 184 | BIO_ACCEPT *data; | 190 | BIO_ACCEPT *data; |
| 185 | 191 | ||
| 186 | if (a == NULL) return(0); | 192 | if (a == NULL) |
| 187 | data=(BIO_ACCEPT *)a->ptr; | 193 | return (0); |
| 188 | 194 | data = (BIO_ACCEPT *)a->ptr; | |
| 189 | if (a->shutdown) | 195 | |
| 190 | { | 196 | if (a->shutdown) { |
| 191 | acpt_close_socket(a); | 197 | acpt_close_socket(a); |
| 192 | BIO_ACCEPT_free(data); | 198 | BIO_ACCEPT_free(data); |
| 193 | a->ptr=NULL; | 199 | a->ptr = NULL; |
| 194 | a->flags=0; | 200 | a->flags = 0; |
| 195 | a->init=0; | 201 | a->init = 0; |
| 196 | } | ||
| 197 | return(1); | ||
| 198 | } | 202 | } |
| 199 | 203 | return (1); | |
| 200 | static int acpt_state(BIO *b, BIO_ACCEPT *c) | 204 | } |
| 201 | { | 205 | |
| 202 | BIO *bio=NULL,*dbio; | 206 | static int |
| 203 | int s= -1; | 207 | acpt_state(BIO *b, BIO_ACCEPT *c) |
| 208 | { | ||
| 209 | BIO *bio = NULL, *dbio; | ||
| 210 | int s = -1; | ||
| 204 | int i; | 211 | int i; |
| 205 | 212 | ||
| 206 | again: | 213 | again: |
| 207 | switch (c->state) | 214 | switch (c->state) { |
| 208 | { | ||
| 209 | case ACPT_S_BEFORE: | 215 | case ACPT_S_BEFORE: |
| 210 | if (c->param_addr == NULL) | 216 | if (c->param_addr == NULL) { |
| 211 | { | 217 | BIOerr(BIO_F_ACPT_STATE, BIO_R_NO_ACCEPT_PORT_SPECIFIED); |
| 212 | BIOerr(BIO_F_ACPT_STATE,BIO_R_NO_ACCEPT_PORT_SPECIFIED); | 218 | return (-1); |
| 213 | return(-1); | 219 | } |
| 214 | } | 220 | s = BIO_get_accept_socket(c->param_addr, c->bind_mode); |
| 215 | s=BIO_get_accept_socket(c->param_addr,c->bind_mode); | ||
| 216 | if (s == -1) | 221 | if (s == -1) |
| 217 | return(-1); | 222 | return (-1); |
| 218 | 223 | ||
| 219 | if (c->accept_nbio) | 224 | if (c->accept_nbio) { |
| 220 | { | 225 | if (!BIO_socket_nbio(s, 1)) { |
| 221 | if (!BIO_socket_nbio(s,1)) | ||
| 222 | { | ||
| 223 | close(s); | 226 | close(s); |
| 224 | BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET); | 227 | BIOerr(BIO_F_ACPT_STATE, BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET); |
| 225 | return(-1); | 228 | return (-1); |
| 226 | } | ||
| 227 | } | 229 | } |
| 228 | c->accept_sock=s; | 230 | } |
| 229 | b->num=s; | 231 | c->accept_sock = s; |
| 230 | c->state=ACPT_S_GET_ACCEPT_SOCKET; | 232 | b->num = s; |
| 231 | return(1); | 233 | c->state = ACPT_S_GET_ACCEPT_SOCKET; |
| 234 | return (1); | ||
| 232 | /* break; */ | 235 | /* break; */ |
| 233 | case ACPT_S_GET_ACCEPT_SOCKET: | 236 | case ACPT_S_GET_ACCEPT_SOCKET: |
| 234 | if (b->next_bio != NULL) | 237 | if (b->next_bio != NULL) { |
| 235 | { | 238 | c->state = ACPT_S_OK; |
| 236 | c->state=ACPT_S_OK; | ||
| 237 | goto again; | 239 | goto again; |
| 238 | } | 240 | } |
| 239 | BIO_clear_retry_flags(b); | 241 | BIO_clear_retry_flags(b); |
| 240 | b->retry_reason=0; | 242 | b->retry_reason = 0; |
| 241 | i=BIO_accept(c->accept_sock,&(c->addr)); | 243 | i = BIO_accept(c->accept_sock, &(c->addr)); |
| 242 | 244 | ||
| 243 | /* -2 return means we should retry */ | 245 | /* -2 return means we should retry */ |
| 244 | if(i == -2) | 246 | if (i == -2) { |
| 245 | { | ||
| 246 | BIO_set_retry_special(b); | 247 | BIO_set_retry_special(b); |
| 247 | b->retry_reason=BIO_RR_ACCEPT; | 248 | b->retry_reason = BIO_RR_ACCEPT; |
| 248 | return -1; | 249 | return -1; |
| 249 | } | 250 | } |
| 250 | 251 | ||
| 251 | if (i < 0) return(i); | 252 | if (i < 0) |
| 253 | return (i); | ||
| 252 | 254 | ||
| 253 | bio=BIO_new_socket(i,BIO_CLOSE); | 255 | bio = BIO_new_socket(i, BIO_CLOSE); |
| 254 | if (bio == NULL) goto err; | 256 | if (bio == NULL) |
| 257 | goto err; | ||
| 255 | 258 | ||
| 256 | BIO_set_callback(bio,BIO_get_callback(b)); | 259 | BIO_set_callback(bio, BIO_get_callback(b)); |
| 257 | BIO_set_callback_arg(bio,BIO_get_callback_arg(b)); | 260 | BIO_set_callback_arg(bio, BIO_get_callback_arg(b)); |
| 258 | 261 | ||
| 259 | if (c->nbio) | 262 | if (c->nbio) { |
| 260 | { | 263 | if (!BIO_socket_nbio(i, 1)) { |
| 261 | if (!BIO_socket_nbio(i,1)) | 264 | BIOerr(BIO_F_ACPT_STATE, BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET); |
| 262 | { | ||
| 263 | BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET); | ||
| 264 | goto err; | 265 | goto err; |
| 265 | } | ||
| 266 | } | 266 | } |
| 267 | } | ||
| 267 | 268 | ||
| 268 | /* If the accept BIO has an bio_chain, we dup it and | 269 | /* If the accept BIO has an bio_chain, we dup it and |
| 269 | * put the new socket at the end. */ | 270 | * put the new socket at the end. */ |
| 270 | if (c->bio_chain != NULL) | 271 | if (c->bio_chain != NULL) { |
| 271 | { | 272 | if ((dbio = BIO_dup_chain(c->bio_chain)) == NULL) |
| 272 | if ((dbio=BIO_dup_chain(c->bio_chain)) == NULL) | ||
| 273 | goto err; | 273 | goto err; |
| 274 | if (!BIO_push(dbio,bio)) goto err; | 274 | if (!BIO_push(dbio, bio)) goto err; |
| 275 | bio=dbio; | 275 | bio = dbio; |
| 276 | } | 276 | } |
| 277 | if (BIO_push(b,bio) == NULL) goto err; | 277 | if (BIO_push(b, bio) |
| 278 | == NULL) goto err; | ||
| 279 | |||
| 280 | c->state = ACPT_S_OK; | ||
| 281 | return (1); | ||
| 278 | 282 | ||
| 279 | c->state=ACPT_S_OK; | ||
| 280 | return(1); | ||
| 281 | err: | 283 | err: |
| 282 | if (bio != NULL) | 284 | if (bio != NULL) |
| 283 | BIO_free(bio); | 285 | BIO_free(bio); |
| 284 | else if (s >= 0) | 286 | else if (s >= 0) |
| 285 | close(s); | 287 | close(s); |
| 286 | return(0); | 288 | return (0); |
| 287 | /* break; */ | 289 | /* break; */ |
| 288 | case ACPT_S_OK: | 290 | case ACPT_S_OK: |
| 289 | if (b->next_bio == NULL) | 291 | if (b->next_bio == NULL) { |
| 290 | { | 292 | c->state = ACPT_S_GET_ACCEPT_SOCKET; |
| 291 | c->state=ACPT_S_GET_ACCEPT_SOCKET; | ||
| 292 | goto again; | 293 | goto again; |
| 293 | } | 294 | } |
| 294 | return(1); | 295 | return (1); |
| 295 | /* break; */ | 296 | /* break; */ |
| 296 | default: | 297 | default: |
| 297 | return(0); | 298 | return (0); |
| 298 | /* break; */ | 299 | /* break; */ |
| 299 | } | ||
| 300 | |||
| 301 | } | 300 | } |
| 301 | } | ||
| 302 | 302 | ||
| 303 | static int acpt_read(BIO *b, char *out, int outl) | 303 | static int |
| 304 | { | 304 | acpt_read(BIO *b, char *out, int outl) |
| 305 | int ret=0; | 305 | { |
| 306 | int ret = 0; | ||
| 306 | BIO_ACCEPT *data; | 307 | BIO_ACCEPT *data; |
| 307 | 308 | ||
| 308 | BIO_clear_retry_flags(b); | 309 | BIO_clear_retry_flags(b); |
| 309 | data=(BIO_ACCEPT *)b->ptr; | 310 | data = (BIO_ACCEPT *)b->ptr; |
| 310 | 311 | ||
| 311 | while (b->next_bio == NULL) | 312 | while (b->next_bio == NULL) { |
| 312 | { | 313 | ret = acpt_state(b, data); |
| 313 | ret=acpt_state(b,data); | 314 | if (ret <= 0) |
| 314 | if (ret <= 0) return(ret); | 315 | return (ret); |
| 315 | } | 316 | } |
| 316 | 317 | ||
| 317 | ret=BIO_read(b->next_bio,out,outl); | 318 | ret = BIO_read(b->next_bio, out, outl); |
| 318 | BIO_copy_next_retry(b); | 319 | BIO_copy_next_retry(b); |
| 319 | return(ret); | 320 | return (ret); |
| 320 | } | 321 | } |
| 321 | 322 | ||
| 322 | static int acpt_write(BIO *b, const char *in, int inl) | 323 | static int |
| 323 | { | 324 | acpt_write(BIO *b, const char *in, int inl) |
| 325 | { | ||
| 324 | int ret; | 326 | int ret; |
| 325 | BIO_ACCEPT *data; | 327 | BIO_ACCEPT *data; |
| 326 | 328 | ||
| 327 | BIO_clear_retry_flags(b); | 329 | BIO_clear_retry_flags(b); |
| 328 | data=(BIO_ACCEPT *)b->ptr; | 330 | data = (BIO_ACCEPT *)b->ptr; |
| 329 | 331 | ||
| 330 | while (b->next_bio == NULL) | 332 | while (b->next_bio == NULL) { |
| 331 | { | 333 | ret = acpt_state(b, data); |
| 332 | ret=acpt_state(b,data); | 334 | if (ret <= 0) |
| 333 | if (ret <= 0) return(ret); | 335 | return (ret); |
| 334 | } | 336 | } |
| 335 | 337 | ||
| 336 | ret=BIO_write(b->next_bio,in,inl); | 338 | ret = BIO_write(b->next_bio, in, inl); |
| 337 | BIO_copy_next_retry(b); | 339 | BIO_copy_next_retry(b); |
| 338 | return(ret); | 340 | return (ret); |
| 339 | } | 341 | } |
| 340 | 342 | ||
| 341 | static long acpt_ctrl(BIO *b, int cmd, long num, void *ptr) | 343 | static long |
| 342 | { | 344 | acpt_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 345 | { | ||
| 343 | int *ip; | 346 | int *ip; |
| 344 | long ret=1; | 347 | long ret = 1; |
| 345 | BIO_ACCEPT *data; | 348 | BIO_ACCEPT *data; |
| 346 | char **pp; | 349 | char **pp; |
| 347 | 350 | ||
| 348 | data=(BIO_ACCEPT *)b->ptr; | 351 | data = (BIO_ACCEPT *)b->ptr; |
| 349 | 352 | ||
| 350 | switch (cmd) | 353 | switch (cmd) { |
| 351 | { | ||
| 352 | case BIO_CTRL_RESET: | 354 | case BIO_CTRL_RESET: |
| 353 | ret=0; | 355 | ret = 0; |
| 354 | data->state=ACPT_S_BEFORE; | 356 | data->state = ACPT_S_BEFORE; |
| 355 | acpt_close_socket(b); | 357 | acpt_close_socket(b); |
| 356 | b->flags=0; | 358 | b->flags = 0; |
| 357 | break; | 359 | break; |
| 358 | case BIO_C_DO_STATE_MACHINE: | 360 | case BIO_C_DO_STATE_MACHINE: |
| 359 | /* use this one to start the connection */ | 361 | /* use this one to start the connection */ |
| 360 | ret=(long)acpt_state(b,data); | 362 | ret = (long)acpt_state(b, data); |
| 361 | break; | 363 | break; |
| 362 | case BIO_C_SET_ACCEPT: | 364 | case BIO_C_SET_ACCEPT: |
| 363 | if (ptr != NULL) | 365 | if (ptr != NULL) { |
| 364 | { | 366 | if (num == 0) { |
| 365 | if (num == 0) | 367 | b->init = 1; |
| 366 | { | ||
| 367 | b->init=1; | ||
| 368 | if (data->param_addr != NULL) | 368 | if (data->param_addr != NULL) |
| 369 | OPENSSL_free(data->param_addr); | 369 | OPENSSL_free(data->param_addr); |
| 370 | data->param_addr=BUF_strdup(ptr); | 370 | data->param_addr = BUF_strdup(ptr); |
| 371 | } | 371 | } else if (num == 1) { |
| 372 | else if (num == 1) | 372 | data->accept_nbio = (ptr != NULL); |
| 373 | { | 373 | } else if (num == 2) { |
| 374 | data->accept_nbio=(ptr != NULL); | ||
| 375 | } | ||
| 376 | else if (num == 2) | ||
| 377 | { | ||
| 378 | if (data->bio_chain != NULL) | 374 | if (data->bio_chain != NULL) |
| 379 | BIO_free(data->bio_chain); | 375 | BIO_free(data->bio_chain); |
| 380 | data->bio_chain=(BIO *)ptr; | 376 | data->bio_chain = (BIO *)ptr; |
| 381 | } | ||
| 382 | } | 377 | } |
| 378 | } | ||
| 383 | break; | 379 | break; |
| 384 | case BIO_C_SET_NBIO: | 380 | case BIO_C_SET_NBIO: |
| 385 | data->nbio=(int)num; | 381 | data->nbio = (int)num; |
| 386 | break; | 382 | break; |
| 387 | case BIO_C_SET_FD: | 383 | case BIO_C_SET_FD: |
| 388 | b->init=1; | 384 | b->init = 1; |
| 389 | b->num= *((int *)ptr); | 385 | b->num= *((int *)ptr); |
| 390 | data->accept_sock=b->num; | 386 | data->accept_sock = b->num; |
| 391 | data->state=ACPT_S_GET_ACCEPT_SOCKET; | 387 | data->state = ACPT_S_GET_ACCEPT_SOCKET; |
| 392 | b->shutdown=(int)num; | 388 | b->shutdown = (int)num; |
| 393 | b->init=1; | 389 | b->init = 1; |
| 394 | break; | 390 | break; |
| 395 | case BIO_C_GET_FD: | 391 | case BIO_C_GET_FD: |
| 396 | if (b->init) | 392 | if (b->init) { |
| 397 | { | 393 | ip = (int *)ptr; |
| 398 | ip=(int *)ptr; | ||
| 399 | if (ip != NULL) | 394 | if (ip != NULL) |
| 400 | *ip=data->accept_sock; | 395 | *ip = data->accept_sock; |
| 401 | ret=data->accept_sock; | 396 | ret = data->accept_sock; |
| 402 | } | 397 | } else |
| 403 | else | 398 | ret = -1; |
| 404 | ret= -1; | ||
| 405 | break; | 399 | break; |
| 406 | case BIO_C_GET_ACCEPT: | 400 | case BIO_C_GET_ACCEPT: |
| 407 | if (b->init) | 401 | if (b->init) { |
| 408 | { | 402 | if (ptr != NULL) { |
| 409 | if (ptr != NULL) | 403 | pp = (char **)ptr; |
| 410 | { | 404 | *pp = data->param_addr; |
| 411 | pp=(char **)ptr; | 405 | } else |
| 412 | *pp=data->param_addr; | 406 | ret = -1; |
| 413 | } | 407 | } else |
| 414 | else | 408 | ret = -1; |
| 415 | ret= -1; | ||
| 416 | } | ||
| 417 | else | ||
| 418 | ret= -1; | ||
| 419 | break; | 409 | break; |
| 420 | case BIO_CTRL_GET_CLOSE: | 410 | case BIO_CTRL_GET_CLOSE: |
| 421 | ret=b->shutdown; | 411 | ret = b->shutdown; |
| 422 | break; | 412 | break; |
| 423 | case BIO_CTRL_SET_CLOSE: | 413 | case BIO_CTRL_SET_CLOSE: |
| 424 | b->shutdown=(int)num; | 414 | b->shutdown = (int)num; |
| 425 | break; | 415 | break; |
| 426 | case BIO_CTRL_PENDING: | 416 | case BIO_CTRL_PENDING: |
| 427 | case BIO_CTRL_WPENDING: | 417 | case BIO_CTRL_WPENDING: |
| 428 | ret=0; | 418 | ret = 0; |
| 429 | break; | 419 | break; |
| 430 | case BIO_CTRL_FLUSH: | 420 | case BIO_CTRL_FLUSH: |
| 431 | break; | 421 | break; |
| 432 | case BIO_C_SET_BIND_MODE: | 422 | case BIO_C_SET_BIND_MODE: |
| 433 | data->bind_mode=(int)num; | 423 | data->bind_mode = (int)num; |
| 434 | break; | 424 | break; |
| 435 | case BIO_C_GET_BIND_MODE: | 425 | case BIO_C_GET_BIND_MODE: |
| 436 | ret=(long)data->bind_mode; | 426 | ret = (long)data->bind_mode; |
| 437 | break; | 427 | break; |
| 438 | case BIO_CTRL_DUP: | 428 | case BIO_CTRL_DUP: |
| 439 | /* dbio=(BIO *)ptr; | 429 | /* dbio=(BIO *)ptr; |
| @@ -441,38 +431,41 @@ static long acpt_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 441 | BIO_set_port(dbio,data->param_port); | 431 | BIO_set_port(dbio,data->param_port); |
| 442 | if (data->param_hostname) | 432 | if (data->param_hostname) |
| 443 | BIO_set_hostname(dbio,data->param_hostname); | 433 | BIO_set_hostname(dbio,data->param_hostname); |
| 444 | BIO_set_nbio(dbio,data->nbio); */ | 434 | BIO_set_nbio(dbio,data->nbio); |
| 435 | */ | ||
| 445 | break; | 436 | break; |
| 446 | 437 | ||
| 447 | default: | 438 | default: |
| 448 | ret=0; | 439 | ret = 0; |
| 449 | break; | 440 | break; |
| 450 | } | ||
| 451 | return(ret); | ||
| 452 | } | 441 | } |
| 453 | 442 | return (ret); | |
| 454 | static int acpt_puts(BIO *bp, const char *str) | 443 | } |
| 455 | { | 444 | |
| 456 | int n,ret; | 445 | static int |
| 457 | 446 | acpt_puts(BIO *bp, const char *str) | |
| 458 | n=strlen(str); | 447 | { |
| 459 | ret=acpt_write(bp,str,n); | 448 | int n, ret; |
| 460 | return(ret); | 449 | |
| 461 | } | 450 | n = strlen(str); |
| 462 | 451 | ret = acpt_write(bp, str, n); | |
| 463 | BIO *BIO_new_accept(char *str) | 452 | return (ret); |
| 464 | { | 453 | } |
| 454 | |||
| 455 | BIO | ||
| 456 | *BIO_new_accept(char *str) | ||
| 457 | { | ||
| 465 | BIO *ret; | 458 | BIO *ret; |
| 466 | 459 | ||
| 467 | ret=BIO_new(BIO_s_accept()); | 460 | ret = BIO_new(BIO_s_accept()); |
| 468 | if (ret == NULL) return(NULL); | 461 | if (ret == NULL) |
| 469 | if (BIO_set_accept_port(ret,str)) | 462 | return (NULL); |
| 470 | return(ret); | 463 | if (BIO_set_accept_port(ret, str)) |
| 471 | else | 464 | return (ret); |
| 472 | { | 465 | else { |
| 473 | BIO_free(ret); | 466 | BIO_free(ret); |
| 474 | return(NULL); | 467 | return (NULL); |
| 475 | } | ||
| 476 | } | 468 | } |
| 469 | } | ||
| 477 | 470 | ||
| 478 | #endif | 471 | #endif |
diff --git a/src/lib/libcrypto/bio/bss_bio.c b/src/lib/libcrypto/bio/bss_bio.c index 52ef0ebcb3..a74fcfdabc 100644 --- a/src/lib/libcrypto/bio/bss_bio.c +++ b/src/lib/libcrypto/bio/bss_bio.c | |||
| @@ -103,8 +103,7 @@ static int bio_puts(BIO *bio, const char *str); | |||
| 103 | static int bio_make_pair(BIO *bio1, BIO *bio2); | 103 | static int bio_make_pair(BIO *bio1, BIO *bio2); |
| 104 | static void bio_destroy_pair(BIO *bio); | 104 | static void bio_destroy_pair(BIO *bio); |
| 105 | 105 | ||
| 106 | static BIO_METHOD methods_biop = | 106 | static BIO_METHOD methods_biop = { |
| 107 | { | ||
| 108 | BIO_TYPE_BIO, | 107 | BIO_TYPE_BIO, |
| 109 | "BIO pair", | 108 | "BIO pair", |
| 110 | bio_write, | 109 | bio_write, |
| @@ -117,50 +116,51 @@ static BIO_METHOD methods_biop = | |||
| 117 | NULL /* no bio_callback_ctrl */ | 116 | NULL /* no bio_callback_ctrl */ |
| 118 | }; | 117 | }; |
| 119 | 118 | ||
| 120 | BIO_METHOD *BIO_s_bio(void) | 119 | BIO_METHOD |
| 121 | { | 120 | *BIO_s_bio(void) |
| 121 | { | ||
| 122 | return &methods_biop; | 122 | return &methods_biop; |
| 123 | } | 123 | } |
| 124 | |||
| 125 | struct bio_bio_st { | ||
| 126 | BIO *peer; /* NULL if buf == NULL. | ||
| 127 | * If peer != NULL, then peer->ptr is also a bio_bio_st, | ||
| 128 | * and its "peer" member points back to us. | ||
| 129 | * peer != NULL iff init != 0 in the BIO. */ | ||
| 124 | 130 | ||
| 125 | struct bio_bio_st | ||
| 126 | { | ||
| 127 | BIO *peer; /* NULL if buf == NULL. | ||
| 128 | * If peer != NULL, then peer->ptr is also a bio_bio_st, | ||
| 129 | * and its "peer" member points back to us. | ||
| 130 | * peer != NULL iff init != 0 in the BIO. */ | ||
| 131 | |||
| 132 | /* This is for what we write (i.e. reading uses peer's struct): */ | 131 | /* This is for what we write (i.e. reading uses peer's struct): */ |
| 133 | int closed; /* valid iff peer != NULL */ | 132 | int closed; /* valid iff peer != NULL */ |
| 134 | size_t len; /* valid iff buf != NULL; 0 if peer == NULL */ | 133 | size_t len; /* valid iff buf != NULL; 0 if peer == NULL */ |
| 135 | size_t offset; /* valid iff buf != NULL; 0 if len == 0 */ | 134 | size_t offset; /* valid iff buf != NULL; 0 if len == 0 */ |
| 136 | size_t size; | 135 | size_t size; |
| 137 | char *buf; /* "size" elements (if != NULL) */ | 136 | char *buf; /* "size" elements (if != NULL) */ |
| 138 | 137 | ||
| 139 | size_t request; /* valid iff peer != NULL; 0 if len != 0, | 138 | size_t request; /* valid iff peer != NULL; 0 if len != 0, |
| 140 | * otherwise set by peer to number of bytes | 139 | * otherwise set by peer to number of bytes |
| 141 | * it (unsuccessfully) tried to read, | 140 | * it (unsuccessfully) tried to read, |
| 142 | * never more than buffer space (size-len) warrants. */ | 141 | * never more than buffer space (size-len) warrants. */ |
| 143 | }; | 142 | }; |
| 144 | 143 | ||
| 145 | static int bio_new(BIO *bio) | 144 | static int |
| 146 | { | 145 | bio_new(BIO *bio) |
| 146 | { | ||
| 147 | struct bio_bio_st *b; | 147 | struct bio_bio_st *b; |
| 148 | 148 | ||
| 149 | b = OPENSSL_malloc(sizeof *b); | 149 | b = OPENSSL_malloc(sizeof *b); |
| 150 | if (b == NULL) | 150 | if (b == NULL) |
| 151 | return 0; | 151 | return 0; |
| 152 | 152 | ||
| 153 | b->peer = NULL; | 153 | b->peer = NULL; |
| 154 | b->size = 17*1024; /* enough for one TLS record (just a default) */ | 154 | b->size = 17 * 1024; /* enough for one TLS record (just a default) */ |
| 155 | b->buf = NULL; | 155 | b->buf = NULL; |
| 156 | 156 | ||
| 157 | bio->ptr = b; | 157 | bio->ptr = b; |
| 158 | return 1; | 158 | return 1; |
| 159 | } | 159 | } |
| 160 | 160 | ||
| 161 | 161 | static int | |
| 162 | static int bio_free(BIO *bio) | 162 | bio_free(BIO *bio) |
| 163 | { | 163 | { |
| 164 | struct bio_bio_st *b; | 164 | struct bio_bio_st *b; |
| 165 | 165 | ||
| 166 | if (bio == NULL) | 166 | if (bio == NULL) |
| @@ -171,21 +171,21 @@ static int bio_free(BIO *bio) | |||
| 171 | 171 | ||
| 172 | if (b->peer) | 172 | if (b->peer) |
| 173 | bio_destroy_pair(bio); | 173 | bio_destroy_pair(bio); |
| 174 | 174 | ||
| 175 | if (b->buf != NULL) | 175 | if (b->buf != NULL) { |
| 176 | { | ||
| 177 | OPENSSL_free(b->buf); | 176 | OPENSSL_free(b->buf); |
| 178 | } | 177 | } |
| 179 | 178 | ||
| 180 | OPENSSL_free(b); | 179 | OPENSSL_free(b); |
| 181 | 180 | ||
| 182 | return 1; | 181 | return 1; |
| 183 | } | 182 | } |
| 184 | 183 | ||
| 185 | 184 | ||
| 186 | 185 | ||
| 187 | static int bio_read(BIO *bio, char *buf, int size_) | 186 | static int |
| 188 | { | 187 | bio_read(BIO *bio, char *buf, int size_) |
| 188 | { | ||
| 189 | size_t size = size_; | 189 | size_t size = size_; |
| 190 | size_t rest; | 190 | size_t rest; |
| 191 | struct bio_bio_st *b, *peer_b; | 191 | struct bio_bio_st *b, *peer_b; |
| @@ -207,12 +207,10 @@ static int bio_read(BIO *bio, char *buf, int size_) | |||
| 207 | if (buf == NULL || size == 0) | 207 | if (buf == NULL || size == 0) |
| 208 | return 0; | 208 | return 0; |
| 209 | 209 | ||
| 210 | if (peer_b->len == 0) | 210 | if (peer_b->len == 0) { |
| 211 | { | ||
| 212 | if (peer_b->closed) | 211 | if (peer_b->closed) |
| 213 | return 0; /* writer has closed, and no data is left */ | 212 | return 0; /* writer has closed, and no data is left */ |
| 214 | else | 213 | else { |
| 215 | { | ||
| 216 | BIO_set_retry_read(bio); /* buffer is empty */ | 214 | BIO_set_retry_read(bio); /* buffer is empty */ |
| 217 | if (size <= peer_b->size) | 215 | if (size <= peer_b->size) |
| 218 | peer_b->request = size; | 216 | peer_b->request = size; |
| @@ -221,22 +219,22 @@ static int bio_read(BIO *bio, char *buf, int size_) | |||
| 221 | * deliver in one write */ | 219 | * deliver in one write */ |
| 222 | peer_b->request = peer_b->size; | 220 | peer_b->request = peer_b->size; |
| 223 | return -1; | 221 | return -1; |
| 224 | } | ||
| 225 | } | 222 | } |
| 223 | } | ||
| 226 | 224 | ||
| 227 | /* we can read */ | 225 | /* we can read */ |
| 228 | if (peer_b->len < size) | 226 | if (peer_b->len < size) |
| 229 | size = peer_b->len; | 227 | size = peer_b->len; |
| 230 | 228 | ||
| 231 | /* now read "size" bytes */ | 229 | /* now read "size" bytes */ |
| 232 | 230 | ||
| 233 | rest = size; | 231 | rest = size; |
| 234 | 232 | ||
| 235 | assert(rest > 0); | 233 | assert(rest > 0); |
| 236 | do /* one or two iterations */ | 234 | do /* one or two iterations */ |
| 237 | { | 235 | { |
| 238 | size_t chunk; | 236 | size_t chunk; |
| 239 | 237 | ||
| 240 | assert(rest <= peer_b->len); | 238 | assert(rest <= peer_b->len); |
| 241 | if (peer_b->offset + rest <= peer_b->size) | 239 | if (peer_b->offset + rest <= peer_b->size) |
| 242 | chunk = rest; | 240 | chunk = rest; |
| @@ -244,30 +242,26 @@ static int bio_read(BIO *bio, char *buf, int size_) | |||
| 244 | /* wrap around ring buffer */ | 242 | /* wrap around ring buffer */ |
| 245 | chunk = peer_b->size - peer_b->offset; | 243 | chunk = peer_b->size - peer_b->offset; |
| 246 | assert(peer_b->offset + chunk <= peer_b->size); | 244 | assert(peer_b->offset + chunk <= peer_b->size); |
| 247 | 245 | ||
| 248 | memcpy(buf, peer_b->buf + peer_b->offset, chunk); | 246 | memcpy(buf, peer_b->buf + peer_b->offset, chunk); |
| 249 | 247 | ||
| 250 | peer_b->len -= chunk; | 248 | peer_b->len -= chunk; |
| 251 | if (peer_b->len) | 249 | if (peer_b->len) { |
| 252 | { | ||
| 253 | peer_b->offset += chunk; | 250 | peer_b->offset += chunk; |
| 254 | assert(peer_b->offset <= peer_b->size); | 251 | assert(peer_b->offset <= peer_b->size); |
| 255 | if (peer_b->offset == peer_b->size) | 252 | if (peer_b->offset == peer_b->size) |
| 256 | peer_b->offset = 0; | 253 | peer_b->offset = 0; |
| 257 | buf += chunk; | 254 | buf += chunk; |
| 258 | } | 255 | } else { |
| 259 | else | ||
| 260 | { | ||
| 261 | /* buffer now empty, no need to advance "buf" */ | 256 | /* buffer now empty, no need to advance "buf" */ |
| 262 | assert(chunk == rest); | 257 | assert(chunk == rest); |
| 263 | peer_b->offset = 0; | 258 | peer_b->offset = 0; |
| 264 | } | ||
| 265 | rest -= chunk; | ||
| 266 | } | 259 | } |
| 267 | while (rest); | 260 | rest -= chunk; |
| 268 | 261 | } while (rest); | |
| 262 | |||
| 269 | return size; | 263 | return size; |
| 270 | } | 264 | } |
| 271 | 265 | ||
| 272 | /* non-copying interface: provide pointer to available data in buffer | 266 | /* non-copying interface: provide pointer to available data in buffer |
| 273 | * bio_nread0: return number of available bytes | 267 | * bio_nread0: return number of available bytes |
| @@ -277,32 +271,32 @@ static int bio_read(BIO *bio, char *buf, int size_) | |||
| 277 | */ | 271 | */ |
| 278 | /* WARNING: The non-copying interface is largely untested as of yet | 272 | /* WARNING: The non-copying interface is largely untested as of yet |
| 279 | * and may contain bugs. */ | 273 | * and may contain bugs. */ |
| 280 | static ossl_ssize_t bio_nread0(BIO *bio, char **buf) | 274 | static ossl_ssize_t |
| 281 | { | 275 | bio_nread0(BIO *bio, char **buf) |
| 276 | { | ||
| 282 | struct bio_bio_st *b, *peer_b; | 277 | struct bio_bio_st *b, *peer_b; |
| 283 | ossl_ssize_t num; | 278 | ossl_ssize_t num; |
| 284 | 279 | ||
| 285 | BIO_clear_retry_flags(bio); | 280 | BIO_clear_retry_flags(bio); |
| 286 | 281 | ||
| 287 | if (!bio->init) | 282 | if (!bio->init) |
| 288 | return 0; | 283 | return 0; |
| 289 | 284 | ||
| 290 | b = bio->ptr; | 285 | b = bio->ptr; |
| 291 | assert(b != NULL); | 286 | assert(b != NULL); |
| 292 | assert(b->peer != NULL); | 287 | assert(b->peer != NULL); |
| 293 | peer_b = b->peer->ptr; | 288 | peer_b = b->peer->ptr; |
| 294 | assert(peer_b != NULL); | 289 | assert(peer_b != NULL); |
| 295 | assert(peer_b->buf != NULL); | 290 | assert(peer_b->buf != NULL); |
| 296 | 291 | ||
| 297 | peer_b->request = 0; | 292 | peer_b->request = 0; |
| 298 | 293 | ||
| 299 | if (peer_b->len == 0) | 294 | if (peer_b->len == 0) { |
| 300 | { | ||
| 301 | char dummy; | 295 | char dummy; |
| 302 | 296 | ||
| 303 | /* avoid code duplication -- nothing available for reading */ | 297 | /* avoid code duplication -- nothing available for reading */ |
| 304 | return bio_read(bio, &dummy, 1); /* returns 0 or -1 */ | 298 | return bio_read(bio, &dummy, 1); /* returns 0 or -1 */ |
| 305 | } | 299 | } |
| 306 | 300 | ||
| 307 | num = peer_b->len; | 301 | num = peer_b->len; |
| 308 | if (peer_b->size < peer_b->offset + num) | 302 | if (peer_b->size < peer_b->offset + num) |
| @@ -313,10 +307,11 @@ static ossl_ssize_t bio_nread0(BIO *bio, char **buf) | |||
| 313 | if (buf != NULL) | 307 | if (buf != NULL) |
| 314 | *buf = peer_b->buf + peer_b->offset; | 308 | *buf = peer_b->buf + peer_b->offset; |
| 315 | return num; | 309 | return num; |
| 316 | } | 310 | } |
| 317 | 311 | ||
| 318 | static ossl_ssize_t bio_nread(BIO *bio, char **buf, size_t num_) | 312 | static ossl_ssize_t |
| 319 | { | 313 | bio_nread(BIO *bio, char **buf, size_t num_) |
| 314 | { | ||
| 320 | struct bio_bio_st *b, *peer_b; | 315 | struct bio_bio_st *b, *peer_b; |
| 321 | ossl_ssize_t num, available; | 316 | ossl_ssize_t num, available; |
| 322 | 317 | ||
| @@ -335,22 +330,21 @@ static ossl_ssize_t bio_nread(BIO *bio, char **buf, size_t num_) | |||
| 335 | peer_b = b->peer->ptr; | 330 | peer_b = b->peer->ptr; |
| 336 | 331 | ||
| 337 | peer_b->len -= num; | 332 | peer_b->len -= num; |
| 338 | if (peer_b->len) | 333 | if (peer_b->len) { |
| 339 | { | ||
| 340 | peer_b->offset += num; | 334 | peer_b->offset += num; |
| 341 | assert(peer_b->offset <= peer_b->size); | 335 | assert(peer_b->offset <= peer_b->size); |
| 342 | if (peer_b->offset == peer_b->size) | 336 | if (peer_b->offset == peer_b->size) |
| 343 | peer_b->offset = 0; | 337 | peer_b->offset = 0; |
| 344 | } | 338 | } else |
| 345 | else | ||
| 346 | peer_b->offset = 0; | 339 | peer_b->offset = 0; |
| 347 | 340 | ||
| 348 | return num; | 341 | return num; |
| 349 | } | 342 | } |
| 350 | 343 | ||
| 351 | 344 | ||
| 352 | static int bio_write(BIO *bio, const char *buf, int num_) | 345 | static int |
| 353 | { | 346 | bio_write(BIO *bio, const char *buf, int num_) |
| 347 | { | ||
| 354 | size_t num = num_; | 348 | size_t num = num_; |
| 355 | size_t rest; | 349 | size_t rest; |
| 356 | struct bio_bio_st *b; | 350 | struct bio_bio_st *b; |
| @@ -360,38 +354,37 @@ static int bio_write(BIO *bio, const char *buf, int num_) | |||
| 360 | if (!bio->init || buf == NULL || num == 0) | 354 | if (!bio->init || buf == NULL || num == 0) |
| 361 | return 0; | 355 | return 0; |
| 362 | 356 | ||
| 363 | b = bio->ptr; | 357 | b = bio->ptr; |
| 358 | |||
| 364 | assert(b != NULL); | 359 | assert(b != NULL); |
| 365 | assert(b->peer != NULL); | 360 | assert(b->peer != NULL); |
| 366 | assert(b->buf != NULL); | 361 | assert(b->buf != NULL); |
| 367 | 362 | ||
| 368 | b->request = 0; | 363 | b->request = 0; |
| 369 | if (b->closed) | 364 | if (b->closed) { |
| 370 | { | ||
| 371 | /* we already closed */ | 365 | /* we already closed */ |
| 372 | BIOerr(BIO_F_BIO_WRITE, BIO_R_BROKEN_PIPE); | 366 | BIOerr(BIO_F_BIO_WRITE, BIO_R_BROKEN_PIPE); |
| 373 | return -1; | 367 | return -1; |
| 374 | } | 368 | } |
| 375 | 369 | ||
| 376 | assert(b->len <= b->size); | 370 | assert(b->len <= b->size); |
| 377 | 371 | ||
| 378 | if (b->len == b->size) | 372 | if (b->len == b->size) { |
| 379 | { | ||
| 380 | BIO_set_retry_write(bio); /* buffer is full */ | 373 | BIO_set_retry_write(bio); /* buffer is full */ |
| 381 | return -1; | 374 | return -1; |
| 382 | } | 375 | } |
| 383 | 376 | ||
| 384 | /* we can write */ | 377 | /* we can write */ |
| 385 | if (num > b->size - b->len) | 378 | if (num > b->size - b->len) |
| 386 | num = b->size - b->len; | 379 | num = b->size - b->len; |
| 387 | 380 | ||
| 388 | /* now write "num" bytes */ | 381 | /* now write "num" bytes */ |
| 389 | 382 | ||
| 390 | rest = num; | 383 | rest = num; |
| 391 | 384 | ||
| 392 | assert(rest > 0); | 385 | assert(rest > 0); |
| 393 | do /* one or two iterations */ | 386 | do /* one or two iterations */ |
| 394 | { | 387 | { |
| 395 | size_t write_offset; | 388 | size_t write_offset; |
| 396 | size_t chunk; | 389 | size_t chunk; |
| 397 | 390 | ||
| @@ -407,20 +400,19 @@ static int bio_write(BIO *bio, const char *buf, int num_) | |||
| 407 | else | 400 | else |
| 408 | /* wrap around ring buffer */ | 401 | /* wrap around ring buffer */ |
| 409 | chunk = b->size - write_offset; | 402 | chunk = b->size - write_offset; |
| 410 | 403 | ||
| 411 | memcpy(b->buf + write_offset, buf, chunk); | 404 | memcpy(b->buf + write_offset, buf, chunk); |
| 412 | 405 | ||
| 413 | b->len += chunk; | 406 | b->len += chunk; |
| 414 | 407 | ||
| 415 | assert(b->len <= b->size); | 408 | assert(b->len <= b->size); |
| 416 | 409 | ||
| 417 | rest -= chunk; | 410 | rest -= chunk; |
| 418 | buf += chunk; | 411 | buf += chunk; |
| 419 | } | 412 | } while (rest); |
| 420 | while (rest); | ||
| 421 | 413 | ||
| 422 | return num; | 414 | return num; |
| 423 | } | 415 | } |
| 424 | 416 | ||
| 425 | /* non-copying interface: provide pointer to region to write to | 417 | /* non-copying interface: provide pointer to region to write to |
| 426 | * bio_nwrite0: check how much space is available | 418 | * bio_nwrite0: check how much space is available |
| @@ -428,8 +420,9 @@ static int bio_write(BIO *bio, const char *buf, int num_) | |||
| 428 | * (example usage: bio_nwrite0(), write to buffer, bio_nwrite() | 420 | * (example usage: bio_nwrite0(), write to buffer, bio_nwrite() |
| 429 | * or just bio_nwrite(), write to buffer) | 421 | * or just bio_nwrite(), write to buffer) |
| 430 | */ | 422 | */ |
| 431 | static ossl_ssize_t bio_nwrite0(BIO *bio, char **buf) | 423 | static ossl_ssize_t |
| 432 | { | 424 | bio_nwrite0(BIO *bio, char **buf) |
| 425 | { | ||
| 433 | struct bio_bio_st *b; | 426 | struct bio_bio_st *b; |
| 434 | size_t num; | 427 | size_t num; |
| 435 | size_t write_offset; | 428 | size_t write_offset; |
| @@ -439,25 +432,24 @@ static ossl_ssize_t bio_nwrite0(BIO *bio, char **buf) | |||
| 439 | if (!bio->init) | 432 | if (!bio->init) |
| 440 | return 0; | 433 | return 0; |
| 441 | 434 | ||
| 442 | b = bio->ptr; | 435 | b = bio->ptr; |
| 436 | |||
| 443 | assert(b != NULL); | 437 | assert(b != NULL); |
| 444 | assert(b->peer != NULL); | 438 | assert(b->peer != NULL); |
| 445 | assert(b->buf != NULL); | 439 | assert(b->buf != NULL); |
| 446 | 440 | ||
| 447 | b->request = 0; | 441 | b->request = 0; |
| 448 | if (b->closed) | 442 | if (b->closed) { |
| 449 | { | ||
| 450 | BIOerr(BIO_F_BIO_NWRITE0, BIO_R_BROKEN_PIPE); | 443 | BIOerr(BIO_F_BIO_NWRITE0, BIO_R_BROKEN_PIPE); |
| 451 | return -1; | 444 | return -1; |
| 452 | } | 445 | } |
| 453 | 446 | ||
| 454 | assert(b->len <= b->size); | 447 | assert(b->len <= b->size); |
| 455 | 448 | ||
| 456 | if (b->len == b->size) | 449 | if (b->len == b->size) { |
| 457 | { | ||
| 458 | BIO_set_retry_write(bio); | 450 | BIO_set_retry_write(bio); |
| 459 | return -1; | 451 | return -1; |
| 460 | } | 452 | } |
| 461 | 453 | ||
| 462 | num = b->size - b->len; | 454 | num = b->size - b->len; |
| 463 | write_offset = b->offset + b->len; | 455 | write_offset = b->offset + b->len; |
| @@ -474,10 +466,11 @@ static ossl_ssize_t bio_nwrite0(BIO *bio, char **buf) | |||
| 474 | assert(write_offset + num <= b->size); | 466 | assert(write_offset + num <= b->size); |
| 475 | 467 | ||
| 476 | return num; | 468 | return num; |
| 477 | } | 469 | } |
| 478 | 470 | ||
| 479 | static ossl_ssize_t bio_nwrite(BIO *bio, char **buf, size_t num_) | 471 | static ossl_ssize_t |
| 480 | { | 472 | bio_nwrite(BIO *bio, char **buf, size_t num_) |
| 473 | { | ||
| 481 | struct bio_bio_st *b; | 474 | struct bio_bio_st *b; |
| 482 | ossl_ssize_t num, space; | 475 | ossl_ssize_t num, space; |
| 483 | 476 | ||
| @@ -497,46 +490,39 @@ static ossl_ssize_t bio_nwrite(BIO *bio, char **buf, size_t num_) | |||
| 497 | assert(b->len <= b->size); | 490 | assert(b->len <= b->size); |
| 498 | 491 | ||
| 499 | return num; | 492 | return num; |
| 500 | } | 493 | } |
| 501 | 494 | ||
| 502 | 495 | ||
| 503 | static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | 496 | static long |
| 504 | { | 497 | bio_ctrl(BIO *bio, int cmd, long num, void *ptr) |
| 498 | { | ||
| 505 | long ret; | 499 | long ret; |
| 506 | struct bio_bio_st *b = bio->ptr; | 500 | struct bio_bio_st *b = bio->ptr; |
| 507 | 501 | ||
| 508 | assert(b != NULL); | 502 | assert(b != NULL); |
| 509 | 503 | ||
| 510 | switch (cmd) | 504 | switch (cmd) { |
| 511 | { | 505 | /* specific CTRL codes */ |
| 512 | /* specific CTRL codes */ | ||
| 513 | 506 | ||
| 514 | case BIO_C_SET_WRITE_BUF_SIZE: | 507 | case BIO_C_SET_WRITE_BUF_SIZE: |
| 515 | if (b->peer) | 508 | if (b->peer) { |
| 516 | { | ||
| 517 | BIOerr(BIO_F_BIO_CTRL, BIO_R_IN_USE); | 509 | BIOerr(BIO_F_BIO_CTRL, BIO_R_IN_USE); |
| 518 | ret = 0; | 510 | ret = 0; |
| 519 | } | 511 | } else if (num == 0) { |
| 520 | else if (num == 0) | ||
| 521 | { | ||
| 522 | BIOerr(BIO_F_BIO_CTRL, BIO_R_INVALID_ARGUMENT); | 512 | BIOerr(BIO_F_BIO_CTRL, BIO_R_INVALID_ARGUMENT); |
| 523 | ret = 0; | 513 | ret = 0; |
| 524 | } | 514 | } else { |
| 525 | else | ||
| 526 | { | ||
| 527 | size_t new_size = num; | 515 | size_t new_size = num; |
| 528 | 516 | ||
| 529 | if (b->size != new_size) | 517 | if (b->size != new_size) { |
| 530 | { | 518 | if (b->buf) { |
| 531 | if (b->buf) | ||
| 532 | { | ||
| 533 | OPENSSL_free(b->buf); | 519 | OPENSSL_free(b->buf); |
| 534 | b->buf = NULL; | 520 | b->buf = NULL; |
| 535 | } | ||
| 536 | b->size = new_size; | ||
| 537 | } | 521 | } |
| 538 | ret = 1; | 522 | b->size = new_size; |
| 539 | } | 523 | } |
| 524 | ret = 1; | ||
| 525 | } | ||
| 540 | break; | 526 | break; |
| 541 | 527 | ||
| 542 | case BIO_C_GET_WRITE_BUF_SIZE: | 528 | case BIO_C_GET_WRITE_BUF_SIZE: |
| @@ -545,15 +531,15 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 545 | 531 | ||
| 546 | case BIO_C_MAKE_BIO_PAIR: | 532 | case BIO_C_MAKE_BIO_PAIR: |
| 547 | { | 533 | { |
| 548 | BIO *other_bio = ptr; | 534 | BIO *other_bio = ptr; |
| 549 | 535 | ||
| 550 | if (bio_make_pair(bio, other_bio)) | 536 | if (bio_make_pair(bio, other_bio)) |
| 551 | ret = 1; | 537 | ret = 1; |
| 552 | else | 538 | else |
| 553 | ret = 0; | 539 | ret = 0; |
| 554 | } | 540 | } |
| 555 | break; | 541 | break; |
| 556 | 542 | ||
| 557 | case BIO_C_DESTROY_BIO_PAIR: | 543 | case BIO_C_DESTROY_BIO_PAIR: |
| 558 | /* Affects both BIOs in the pair -- call just once! | 544 | /* Affects both BIOs in the pair -- call just once! |
| 559 | * Or let BIO_free(bio1); BIO_free(bio2); do the job. */ | 545 | * Or let BIO_free(bio1); BIO_free(bio2); do the job. */ |
| @@ -596,12 +582,12 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 596 | /* prepare for non-copying read */ | 582 | /* prepare for non-copying read */ |
| 597 | ret = (long) bio_nread0(bio, ptr); | 583 | ret = (long) bio_nread0(bio, ptr); |
| 598 | break; | 584 | break; |
| 599 | 585 | ||
| 600 | case BIO_C_NREAD: | 586 | case BIO_C_NREAD: |
| 601 | /* non-copying read */ | 587 | /* non-copying read */ |
| 602 | ret = (long) bio_nread(bio, ptr, (size_t) num); | 588 | ret = (long) bio_nread(bio, ptr, (size_t) num); |
| 603 | break; | 589 | break; |
| 604 | 590 | ||
| 605 | case BIO_C_NWRITE0: | 591 | case BIO_C_NWRITE0: |
| 606 | /* prepare for non-copying write */ | 592 | /* prepare for non-copying write */ |
| 607 | ret = (long) bio_nwrite0(bio, ptr); | 593 | ret = (long) bio_nwrite0(bio, ptr); |
| @@ -611,18 +597,18 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 611 | /* non-copying write */ | 597 | /* non-copying write */ |
| 612 | ret = (long) bio_nwrite(bio, ptr, (size_t) num); | 598 | ret = (long) bio_nwrite(bio, ptr, (size_t) num); |
| 613 | break; | 599 | break; |
| 614 | |||
| 615 | 600 | ||
| 616 | /* standard CTRL codes follow */ | 601 | |
| 602 | /* standard CTRL codes follow */ | ||
| 617 | 603 | ||
| 618 | case BIO_CTRL_RESET: | 604 | case BIO_CTRL_RESET: |
| 619 | if (b->buf != NULL) | 605 | if (b->buf != NULL) { |
| 620 | { | ||
| 621 | b->len = 0; | 606 | b->len = 0; |
| 622 | b->offset = 0; | 607 | b->offset = 0; |
| 623 | } | 608 | } |
| 624 | ret = 0; | 609 | ret = 0; |
| 625 | break; | 610 | break; |
| 611 | |||
| 626 | 612 | ||
| 627 | case BIO_CTRL_GET_CLOSE: | 613 | case BIO_CTRL_GET_CLOSE: |
| 628 | ret = bio->shutdown; | 614 | ret = bio->shutdown; |
| @@ -634,13 +620,11 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 634 | break; | 620 | break; |
| 635 | 621 | ||
| 636 | case BIO_CTRL_PENDING: | 622 | case BIO_CTRL_PENDING: |
| 637 | if (b->peer != NULL) | 623 | if (b->peer != NULL) { |
| 638 | { | ||
| 639 | struct bio_bio_st *peer_b = b->peer->ptr; | 624 | struct bio_bio_st *peer_b = b->peer->ptr; |
| 640 | 625 | ||
| 641 | ret = (long) peer_b->len; | 626 | ret = (long) peer_b->len; |
| 642 | } | 627 | } else |
| 643 | else | ||
| 644 | ret = 0; | 628 | ret = 0; |
| 645 | break; | 629 | break; |
| 646 | 630 | ||
| @@ -654,16 +638,16 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 654 | case BIO_CTRL_DUP: | 638 | case BIO_CTRL_DUP: |
| 655 | /* See BIO_dup_chain for circumstances we have to expect. */ | 639 | /* See BIO_dup_chain for circumstances we have to expect. */ |
| 656 | { | 640 | { |
| 657 | BIO *other_bio = ptr; | 641 | BIO *other_bio = ptr; |
| 658 | struct bio_bio_st *other_b; | 642 | struct bio_bio_st *other_b; |
| 659 | 643 | ||
| 660 | assert(other_bio != NULL); | 644 | assert(other_bio != NULL); |
| 661 | other_b = other_bio->ptr; | 645 | other_b = other_bio->ptr; |
| 662 | assert(other_b != NULL); | 646 | assert(other_b != NULL); |
| 663 | 647 | ||
| 664 | assert(other_b->buf == NULL); /* other_bio is always fresh */ | 648 | assert(other_b->buf == NULL); /* other_bio is always fresh */ |
| 665 | 649 | ||
| 666 | other_b->size = b->size; | 650 | other_b->size = b->size; |
| 667 | } | 651 | } |
| 668 | 652 | ||
| 669 | ret = 1; | 653 | ret = 1; |
| @@ -675,34 +659,34 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 675 | 659 | ||
| 676 | case BIO_CTRL_EOF: | 660 | case BIO_CTRL_EOF: |
| 677 | { | 661 | { |
| 678 | BIO *other_bio = ptr; | 662 | BIO *other_bio = ptr; |
| 679 | 663 | ||
| 680 | if (other_bio) | 664 | if (other_bio) { |
| 681 | { | 665 | struct bio_bio_st *other_b = other_bio->ptr; |
| 682 | struct bio_bio_st *other_b = other_bio->ptr; | 666 | |
| 683 | 667 | assert(other_b != NULL); | |
| 684 | assert(other_b != NULL); | 668 | ret = other_b->len == 0 && other_b->closed; |
| 685 | ret = other_b->len == 0 && other_b->closed; | 669 | } else |
| 686 | } | 670 | ret = 1; |
| 687 | else | ||
| 688 | ret = 1; | ||
| 689 | } | 671 | } |
| 690 | break; | 672 | break; |
| 691 | 673 | ||
| 692 | default: | 674 | default: |
| 693 | ret = 0; | 675 | ret = 0; |
| 694 | } | ||
| 695 | return ret; | ||
| 696 | } | 676 | } |
| 677 | return ret; | ||
| 678 | } | ||
| 697 | 679 | ||
| 698 | static int bio_puts(BIO *bio, const char *str) | 680 | static int |
| 699 | { | 681 | bio_puts(BIO *bio, const char *str) |
| 682 | { | ||
| 700 | return bio_write(bio, str, strlen(str)); | 683 | return bio_write(bio, str, strlen(str)); |
| 701 | } | 684 | } |
| 702 | 685 | ||
| 703 | 686 | ||
| 704 | static int bio_make_pair(BIO *bio1, BIO *bio2) | 687 | static int |
| 705 | { | 688 | bio_make_pair(BIO *bio1, BIO *bio2) |
| 689 | { | ||
| 706 | struct bio_bio_st *b1, *b2; | 690 | struct bio_bio_st *b1, *b2; |
| 707 | 691 | ||
| 708 | assert(bio1 != NULL); | 692 | assert(bio1 != NULL); |
| @@ -710,37 +694,32 @@ static int bio_make_pair(BIO *bio1, BIO *bio2) | |||
| 710 | 694 | ||
| 711 | b1 = bio1->ptr; | 695 | b1 = bio1->ptr; |
| 712 | b2 = bio2->ptr; | 696 | b2 = bio2->ptr; |
| 713 | 697 | ||
| 714 | if (b1->peer != NULL || b2->peer != NULL) | 698 | if (b1->peer != NULL || b2->peer != NULL) { |
| 715 | { | ||
| 716 | BIOerr(BIO_F_BIO_MAKE_PAIR, BIO_R_IN_USE); | 699 | BIOerr(BIO_F_BIO_MAKE_PAIR, BIO_R_IN_USE); |
| 717 | return 0; | 700 | return 0; |
| 718 | } | 701 | } |
| 719 | 702 | ||
| 720 | if (b1->buf == NULL) | 703 | if (b1->buf == NULL) { |
| 721 | { | ||
| 722 | b1->buf = OPENSSL_malloc(b1->size); | 704 | b1->buf = OPENSSL_malloc(b1->size); |
| 723 | if (b1->buf == NULL) | 705 | if (b1->buf == NULL) { |
| 724 | { | ||
| 725 | BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); | 706 | BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); |
| 726 | return 0; | 707 | return 0; |
| 727 | } | 708 | } |
| 728 | b1->len = 0; | 709 | b1->len = 0; |
| 729 | b1->offset = 0; | 710 | b1->offset = 0; |
| 730 | } | 711 | } |
| 731 | 712 | ||
| 732 | if (b2->buf == NULL) | 713 | if (b2->buf == NULL) { |
| 733 | { | ||
| 734 | b2->buf = OPENSSL_malloc(b2->size); | 714 | b2->buf = OPENSSL_malloc(b2->size); |
| 735 | if (b2->buf == NULL) | 715 | if (b2->buf == NULL) { |
| 736 | { | ||
| 737 | BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); | 716 | BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); |
| 738 | return 0; | 717 | return 0; |
| 739 | } | 718 | } |
| 740 | b2->len = 0; | 719 | b2->len = 0; |
| 741 | b2->offset = 0; | 720 | b2->offset = 0; |
| 742 | } | 721 | } |
| 743 | 722 | ||
| 744 | b1->peer = bio2; | 723 | b1->peer = bio2; |
| 745 | b1->closed = 0; | 724 | b1->closed = 0; |
| 746 | b1->request = 0; | 725 | b1->request = 0; |
| @@ -752,18 +731,17 @@ static int bio_make_pair(BIO *bio1, BIO *bio2) | |||
| 752 | bio2->init = 1; | 731 | bio2->init = 1; |
| 753 | 732 | ||
| 754 | return 1; | 733 | return 1; |
| 755 | } | 734 | } |
| 756 | 735 | ||
| 757 | static void bio_destroy_pair(BIO *bio) | 736 | static void |
| 758 | { | 737 | bio_destroy_pair(BIO *bio) |
| 738 | { | ||
| 759 | struct bio_bio_st *b = bio->ptr; | 739 | struct bio_bio_st *b = bio->ptr; |
| 760 | 740 | ||
| 761 | if (b != NULL) | 741 | if (b != NULL) { |
| 762 | { | ||
| 763 | BIO *peer_bio = b->peer; | 742 | BIO *peer_bio = b->peer; |
| 764 | 743 | ||
| 765 | if (peer_bio != NULL) | 744 | if (peer_bio != NULL) { |
| 766 | { | ||
| 767 | struct bio_bio_st *peer_b = peer_bio->ptr; | 745 | struct bio_bio_st *peer_b = peer_bio->ptr; |
| 768 | 746 | ||
| 769 | assert(peer_b != NULL); | 747 | assert(peer_b != NULL); |
| @@ -774,151 +752,149 @@ static void bio_destroy_pair(BIO *bio) | |||
| 774 | assert(peer_b->buf != NULL); | 752 | assert(peer_b->buf != NULL); |
| 775 | peer_b->len = 0; | 753 | peer_b->len = 0; |
| 776 | peer_b->offset = 0; | 754 | peer_b->offset = 0; |
| 777 | 755 | ||
| 778 | b->peer = NULL; | 756 | b->peer = NULL; |
| 779 | bio->init = 0; | 757 | bio->init = 0; |
| 780 | assert(b->buf != NULL); | 758 | assert(b->buf != NULL); |
| 781 | b->len = 0; | 759 | b->len = 0; |
| 782 | b->offset = 0; | 760 | b->offset = 0; |
| 783 | } | ||
| 784 | } | 761 | } |
| 785 | } | 762 | } |
| 786 | 763 | } | |
| 764 | |||
| 787 | 765 | ||
| 788 | /* Exported convenience functions */ | 766 | /* Exported convenience functions */ |
| 789 | int BIO_new_bio_pair(BIO **bio1_p, size_t writebuf1, | 767 | int |
| 790 | BIO **bio2_p, size_t writebuf2) | 768 | BIO_new_bio_pair(BIO **bio1_p, size_t writebuf1, BIO **bio2_p, size_t writebuf2) |
| 791 | { | 769 | { |
| 792 | BIO *bio1 = NULL, *bio2 = NULL; | 770 | BIO *bio1 = NULL, *bio2 = NULL; |
| 793 | long r; | 771 | long r; |
| 794 | int ret = 0; | 772 | int ret = 0; |
| 795 | 773 | ||
| 796 | bio1 = BIO_new(BIO_s_bio()); | 774 | bio1 = BIO_new(BIO_s_bio()); |
| 797 | if (bio1 == NULL) | 775 | if (bio1 == NULL) |
| 798 | goto err; | 776 | goto err; |
| 799 | bio2 = BIO_new(BIO_s_bio()); | 777 | bio2 = BIO_new(BIO_s_bio()); |
| 800 | if (bio2 == NULL) | 778 | if (bio2 == NULL) |
| 801 | goto err; | 779 | goto err; |
| 802 | 780 | ||
| 803 | if (writebuf1) | 781 | if (writebuf1) { |
| 804 | { | 782 | r = BIO_set_write_buf_size(bio1, writebuf1); |
| 805 | r = BIO_set_write_buf_size(bio1, writebuf1); | 783 | if (!r) |
| 806 | if (!r) | 784 | goto err; |
| 807 | goto err; | 785 | } |
| 808 | } | 786 | if (writebuf2) { |
| 809 | if (writebuf2) | 787 | r = BIO_set_write_buf_size(bio2, writebuf2); |
| 810 | { | 788 | if (!r) |
| 811 | r = BIO_set_write_buf_size(bio2, writebuf2); | 789 | goto err; |
| 812 | if (!r) | ||
| 813 | goto err; | ||
| 814 | } | ||
| 815 | |||
| 816 | r = BIO_make_bio_pair(bio1, bio2); | ||
| 817 | if (!r) | ||
| 818 | goto err; | ||
| 819 | ret = 1; | ||
| 820 | |||
| 821 | err: | ||
| 822 | if (ret == 0) | ||
| 823 | { | ||
| 824 | if (bio1) | ||
| 825 | { | ||
| 826 | BIO_free(bio1); | ||
| 827 | bio1 = NULL; | ||
| 828 | } | ||
| 829 | if (bio2) | ||
| 830 | { | ||
| 831 | BIO_free(bio2); | ||
| 832 | bio2 = NULL; | ||
| 833 | } | ||
| 834 | } | ||
| 835 | |||
| 836 | *bio1_p = bio1; | ||
| 837 | *bio2_p = bio2; | ||
| 838 | return ret; | ||
| 839 | } | ||
| 840 | |||
| 841 | size_t BIO_ctrl_get_write_guarantee(BIO *bio) | ||
| 842 | { | ||
| 843 | return BIO_ctrl(bio, BIO_C_GET_WRITE_GUARANTEE, 0, NULL); | ||
| 844 | } | 790 | } |
| 845 | 791 | ||
| 846 | size_t BIO_ctrl_get_read_request(BIO *bio) | 792 | r = BIO_make_bio_pair(bio1, bio2); |
| 847 | { | 793 | if (!r) |
| 848 | return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, NULL); | 794 | goto err; |
| 795 | ret = 1; | ||
| 796 | |||
| 797 | err: | ||
| 798 | if (ret == 0) { | ||
| 799 | if (bio1) { | ||
| 800 | BIO_free(bio1); | ||
| 801 | bio1 = NULL; | ||
| 802 | } | ||
| 803 | if (bio2) { | ||
| 804 | BIO_free(bio2); | ||
| 805 | bio2 = NULL; | ||
| 806 | } | ||
| 849 | } | 807 | } |
| 850 | 808 | ||
| 851 | int BIO_ctrl_reset_read_request(BIO *bio) | 809 | *bio1_p = bio1; |
| 852 | { | 810 | *bio2_p = bio2; |
| 811 | return ret; | ||
| 812 | } | ||
| 813 | |||
| 814 | size_t | ||
| 815 | BIO_ctrl_get_write_guarantee(BIO *bio) | ||
| 816 | { | ||
| 817 | return BIO_ctrl(bio, BIO_C_GET_WRITE_GUARANTEE, 0, NULL); | ||
| 818 | } | ||
| 819 | |||
| 820 | size_t | ||
| 821 | BIO_ctrl_get_read_request(BIO *bio) | ||
| 822 | { | ||
| 823 | return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, NULL); | ||
| 824 | } | ||
| 825 | |||
| 826 | int | ||
| 827 | BIO_ctrl_reset_read_request(BIO *bio) | ||
| 828 | { | ||
| 853 | return (BIO_ctrl(bio, BIO_C_RESET_READ_REQUEST, 0, NULL) != 0); | 829 | return (BIO_ctrl(bio, BIO_C_RESET_READ_REQUEST, 0, NULL) != 0); |
| 854 | } | 830 | } |
| 855 | 831 | ||
| 856 | 832 | ||
| 857 | /* BIO_nread0/nread/nwrite0/nwrite are available only for BIO pairs for now | 833 | /* BIO_nread0/nread/nwrite0/nwrite are available only for BIO pairs for now |
| 858 | * (conceivably some other BIOs could allow non-copying reads and writes too.) | 834 | * (conceivably some other BIOs could allow non-copying reads and writes too.) |
| 859 | */ | 835 | */ |
| 860 | int BIO_nread0(BIO *bio, char **buf) | 836 | int |
| 861 | { | 837 | BIO_nread0(BIO *bio, char **buf) |
| 838 | { | ||
| 862 | long ret; | 839 | long ret; |
| 863 | 840 | ||
| 864 | if (!bio->init) | 841 | if (!bio->init) { |
| 865 | { | ||
| 866 | BIOerr(BIO_F_BIO_NREAD0, BIO_R_UNINITIALIZED); | 842 | BIOerr(BIO_F_BIO_NREAD0, BIO_R_UNINITIALIZED); |
| 867 | return -2; | 843 | return -2; |
| 868 | } | 844 | } |
| 869 | 845 | ||
| 870 | ret = BIO_ctrl(bio, BIO_C_NREAD0, 0, buf); | 846 | ret = BIO_ctrl(bio, BIO_C_NREAD0, 0, buf); |
| 871 | if (ret > INT_MAX) | 847 | if (ret > INT_MAX) |
| 872 | return INT_MAX; | 848 | return INT_MAX; |
| 873 | else | 849 | else |
| 874 | return (int) ret; | 850 | return (int) ret; |
| 875 | } | 851 | } |
| 876 | 852 | ||
| 877 | int BIO_nread(BIO *bio, char **buf, int num) | 853 | int |
| 878 | { | 854 | BIO_nread(BIO *bio, char **buf, int num) |
| 855 | { | ||
| 879 | int ret; | 856 | int ret; |
| 880 | 857 | ||
| 881 | if (!bio->init) | 858 | if (!bio->init) { |
| 882 | { | ||
| 883 | BIOerr(BIO_F_BIO_NREAD, BIO_R_UNINITIALIZED); | 859 | BIOerr(BIO_F_BIO_NREAD, BIO_R_UNINITIALIZED); |
| 884 | return -2; | 860 | return -2; |
| 885 | } | 861 | } |
| 886 | 862 | ||
| 887 | ret = (int) BIO_ctrl(bio, BIO_C_NREAD, num, buf); | 863 | ret = (int) BIO_ctrl(bio, BIO_C_NREAD, num, buf); |
| 888 | if (ret > 0) | 864 | if (ret > 0) |
| 889 | bio->num_read += ret; | 865 | bio->num_read += ret; |
| 890 | return ret; | 866 | return ret; |
| 891 | } | 867 | } |
| 892 | 868 | ||
| 893 | int BIO_nwrite0(BIO *bio, char **buf) | 869 | int |
| 894 | { | 870 | BIO_nwrite0(BIO *bio, char **buf) |
| 871 | { | ||
| 895 | long ret; | 872 | long ret; |
| 896 | 873 | ||
| 897 | if (!bio->init) | 874 | if (!bio->init) { |
| 898 | { | ||
| 899 | BIOerr(BIO_F_BIO_NWRITE0, BIO_R_UNINITIALIZED); | 875 | BIOerr(BIO_F_BIO_NWRITE0, BIO_R_UNINITIALIZED); |
| 900 | return -2; | 876 | return -2; |
| 901 | } | 877 | } |
| 902 | 878 | ||
| 903 | ret = BIO_ctrl(bio, BIO_C_NWRITE0, 0, buf); | 879 | ret = BIO_ctrl(bio, BIO_C_NWRITE0, 0, buf); |
| 904 | if (ret > INT_MAX) | 880 | if (ret > INT_MAX) |
| 905 | return INT_MAX; | 881 | return INT_MAX; |
| 906 | else | 882 | else |
| 907 | return (int) ret; | 883 | return (int) ret; |
| 908 | } | 884 | } |
| 909 | 885 | ||
| 910 | int BIO_nwrite(BIO *bio, char **buf, int num) | 886 | int |
| 911 | { | 887 | BIO_nwrite(BIO *bio, char **buf, int num) |
| 888 | { | ||
| 912 | int ret; | 889 | int ret; |
| 913 | 890 | ||
| 914 | if (!bio->init) | 891 | if (!bio->init) { |
| 915 | { | ||
| 916 | BIOerr(BIO_F_BIO_NWRITE, BIO_R_UNINITIALIZED); | 892 | BIOerr(BIO_F_BIO_NWRITE, BIO_R_UNINITIALIZED); |
| 917 | return -2; | 893 | return -2; |
| 918 | } | 894 | } |
| 919 | 895 | ||
| 920 | ret = BIO_ctrl(bio, BIO_C_NWRITE, num, buf); | 896 | ret = BIO_ctrl(bio, BIO_C_NWRITE, num, buf); |
| 921 | if (ret > 0) | 897 | if (ret > 0) |
| 922 | bio->num_write += ret; | 898 | bio->num_write += ret; |
| 923 | return ret; | 899 | return ret; |
| 924 | } | 900 | } |
diff --git a/src/lib/libcrypto/bio/bss_conn.c b/src/lib/libcrypto/bio/bss_conn.c index 5162e75c87..df34c49a4a 100644 --- a/src/lib/libcrypto/bio/bss_conn.c +++ b/src/lib/libcrypto/bio/bss_conn.c | |||
| @@ -76,8 +76,7 @@ | |||
| 76 | #endif | 76 | #endif |
| 77 | 77 | ||
| 78 | 78 | ||
| 79 | typedef struct bio_connect_st | 79 | typedef struct bio_connect_st { |
| 80 | { | ||
| 81 | int state; | 80 | int state; |
| 82 | 81 | ||
| 83 | char *param_hostname; | 82 | char *param_hostname; |
| @@ -95,8 +94,8 @@ typedef struct bio_connect_st | |||
| 95 | /* called when the connection is initially made | 94 | /* called when the connection is initially made |
| 96 | * callback(BIO,state,ret); The callback should return | 95 | * callback(BIO,state,ret); The callback should return |
| 97 | * 'ret'. state is for compatibility with the ssl info_callback */ | 96 | * 'ret'. state is for compatibility with the ssl info_callback */ |
| 98 | int (*info_callback)(const BIO *bio,int state,int ret); | 97 | int (*info_callback)(const BIO *bio, int state, int ret); |
| 99 | } BIO_CONNECT; | 98 | } BIO_CONNECT; |
| 100 | 99 | ||
| 101 | static int conn_write(BIO *h, const char *buf, int num); | 100 | static int conn_write(BIO *h, const char *buf, int num); |
| 102 | static int conn_read(BIO *h, char *buf, int size); | 101 | static int conn_read(BIO *h, char *buf, int size); |
| @@ -108,11 +107,10 @@ static long conn_callback_ctrl(BIO *h, int cmd, bio_info_cb *); | |||
| 108 | 107 | ||
| 109 | static int conn_state(BIO *b, BIO_CONNECT *c); | 108 | static int conn_state(BIO *b, BIO_CONNECT *c); |
| 110 | static void conn_close_socket(BIO *data); | 109 | static void conn_close_socket(BIO *data); |
| 111 | BIO_CONNECT *BIO_CONNECT_new(void ); | 110 | BIO_CONNECT *BIO_CONNECT_new(void); |
| 112 | void BIO_CONNECT_free(BIO_CONNECT *a); | 111 | void BIO_CONNECT_free(BIO_CONNECT *a); |
| 113 | 112 | ||
| 114 | static BIO_METHOD methods_connectp= | 113 | static BIO_METHOD methods_connectp = { |
| 115 | { | ||
| 116 | BIO_TYPE_CONNECT, | 114 | BIO_TYPE_CONNECT, |
| 117 | "socket connect", | 115 | "socket connect", |
| 118 | conn_write, | 116 | conn_write, |
| @@ -123,530 +121,501 @@ static BIO_METHOD methods_connectp= | |||
| 123 | conn_new, | 121 | conn_new, |
| 124 | conn_free, | 122 | conn_free, |
| 125 | conn_callback_ctrl, | 123 | conn_callback_ctrl, |
| 126 | }; | 124 | }; |
| 127 | 125 | ||
| 128 | static int conn_state(BIO *b, BIO_CONNECT *c) | 126 | static int |
| 129 | { | 127 | conn_state(BIO *b, BIO_CONNECT *c) |
| 130 | int ret= -1,i; | 128 | { |
| 129 | int ret = -1, i; | ||
| 131 | unsigned long l; | 130 | unsigned long l; |
| 132 | char *p,*q; | 131 | char *p, *q; |
| 133 | int (*cb)(const BIO *,int,int)=NULL; | 132 | int (*cb)(const BIO *, int, int) = NULL; |
| 134 | 133 | ||
| 135 | if (c->info_callback != NULL) | 134 | if (c->info_callback != NULL) |
| 136 | cb=c->info_callback; | 135 | cb = c->info_callback; |
| 137 | 136 | ||
| 138 | for (;;) | 137 | for (;;) { |
| 139 | { | 138 | switch (c->state) { |
| 140 | switch (c->state) | ||
| 141 | { | ||
| 142 | case BIO_CONN_S_BEFORE: | 139 | case BIO_CONN_S_BEFORE: |
| 143 | p=c->param_hostname; | 140 | p = c->param_hostname; |
| 144 | if (p == NULL) | 141 | if (p == NULL) { |
| 145 | { | 142 | BIOerr(BIO_F_CONN_STATE, BIO_R_NO_HOSTNAME_SPECIFIED); |
| 146 | BIOerr(BIO_F_CONN_STATE,BIO_R_NO_HOSTNAME_SPECIFIED); | ||
| 147 | goto exit_loop; | 143 | goto exit_loop; |
| 148 | } | 144 | } |
| 149 | for ( ; *p != '\0'; p++) | 145 | for (; *p != '\0'; p++) { |
| 150 | { | 146 | if ((*p == ':') || (*p == '/')) |
| 151 | if ((*p == ':') || (*p == '/')) break; | 147 | break; |
| 152 | } | 148 | } |
| 153 | 149 | ||
| 154 | i= *p; | 150 | i= *p; |
| 155 | if ((i == ':') || (i == '/')) | 151 | if ((i == ':') || (i == '/')) { |
| 156 | { | 152 | *(p++) = '\0'; |
| 157 | 153 | if (i == ':') { | |
| 158 | *(p++)='\0'; | 154 | for (q = p; *q; q++) |
| 159 | if (i == ':') | 155 | if (*q == '/') { |
| 160 | { | 156 | *q = '\0'; |
| 161 | for (q=p; *q; q++) | ||
| 162 | if (*q == '/') | ||
| 163 | { | ||
| 164 | *q='\0'; | ||
| 165 | break; | 157 | break; |
| 166 | } | 158 | } |
| 167 | if (c->param_port != NULL) | 159 | if (c->param_port != NULL) |
| 168 | OPENSSL_free(c->param_port); | 160 | OPENSSL_free(c->param_port); |
| 169 | c->param_port=BUF_strdup(p); | 161 | c->param_port = BUF_strdup(p); |
| 170 | } | ||
| 171 | } | 162 | } |
| 163 | } | ||
| 172 | 164 | ||
| 173 | if (c->param_port == NULL) | 165 | if (c->param_port == NULL) { |
| 174 | { | 166 | BIOerr(BIO_F_CONN_STATE, BIO_R_NO_PORT_SPECIFIED); |
| 175 | BIOerr(BIO_F_CONN_STATE,BIO_R_NO_PORT_SPECIFIED); | 167 | ERR_add_error_data(2, "host=", c->param_hostname); |
| 176 | ERR_add_error_data(2,"host=",c->param_hostname); | ||
| 177 | goto exit_loop; | 168 | goto exit_loop; |
| 178 | } | 169 | } |
| 179 | c->state=BIO_CONN_S_GET_IP; | 170 | c->state = BIO_CONN_S_GET_IP; |
| 180 | break; | 171 | break; |
| 181 | 172 | ||
| 182 | case BIO_CONN_S_GET_IP: | 173 | case BIO_CONN_S_GET_IP: |
| 183 | if (BIO_get_host_ip(c->param_hostname,&(c->ip[0])) <= 0) | 174 | if (BIO_get_host_ip(c->param_hostname, &(c->ip[0])) <= 0) |
| 184 | goto exit_loop; | 175 | goto exit_loop; |
| 185 | c->state=BIO_CONN_S_GET_PORT; | 176 | c->state = BIO_CONN_S_GET_PORT; |
| 186 | break; | 177 | break; |
| 187 | 178 | ||
| 188 | case BIO_CONN_S_GET_PORT: | 179 | case BIO_CONN_S_GET_PORT: |
| 189 | if (c->param_port == NULL) | 180 | if (c->param_port == NULL) { |
| 190 | { | ||
| 191 | /* abort(); */ | 181 | /* abort(); */ |
| 192 | goto exit_loop; | 182 | goto exit_loop; |
| 193 | } | 183 | } else if (BIO_get_port(c->param_port, &c->port) <= 0) |
| 194 | else if (BIO_get_port(c->param_port,&c->port) <= 0) | ||
| 195 | goto exit_loop; | 184 | goto exit_loop; |
| 196 | c->state=BIO_CONN_S_CREATE_SOCKET; | 185 | c->state = BIO_CONN_S_CREATE_SOCKET; |
| 197 | break; | 186 | break; |
| 198 | 187 | ||
| 199 | case BIO_CONN_S_CREATE_SOCKET: | 188 | case BIO_CONN_S_CREATE_SOCKET: |
| 200 | /* now setup address */ | 189 | /* now setup address */ |
| 201 | memset((char *)&c->them,0,sizeof(c->them)); | 190 | memset((char *)&c->them, 0, sizeof(c->them)); |
| 202 | c->them.sin_family=AF_INET; | 191 | c->them.sin_family = AF_INET; |
| 203 | c->them.sin_port=htons((unsigned short)c->port); | 192 | c->them.sin_port = htons((unsigned short)c->port); |
| 204 | l=(unsigned long) | 193 | l = (unsigned long) |
| 205 | ((unsigned long)c->ip[0]<<24L)| | 194 | ((unsigned long)c->ip[0] << 24L)| |
| 206 | ((unsigned long)c->ip[1]<<16L)| | 195 | ((unsigned long)c->ip[1] << 16L)| |
| 207 | ((unsigned long)c->ip[2]<< 8L)| | 196 | ((unsigned long)c->ip[2] << 8L)| |
| 208 | ((unsigned long)c->ip[3]); | 197 | ((unsigned long)c->ip[3]); |
| 209 | c->them.sin_addr.s_addr=htonl(l); | 198 | c->them.sin_addr.s_addr = htonl(l); |
| 210 | c->state=BIO_CONN_S_CREATE_SOCKET; | 199 | c->state = BIO_CONN_S_CREATE_SOCKET; |
| 211 | 200 | ||
| 212 | ret=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); | 201 | ret = socket(AF_INET, SOCK_STREAM, SOCKET_PROTOCOL); |
| 213 | if (ret == -1) | 202 | if (ret == -1) { |
| 214 | { | 203 | SYSerr(SYS_F_SOCKET, errno); |
| 215 | SYSerr(SYS_F_SOCKET,errno); | 204 | ERR_add_error_data(4, "host=", |
| 216 | ERR_add_error_data(4,"host=",c->param_hostname, | 205 | c->param_hostname, ":", c->param_port); |
| 217 | ":",c->param_port); | 206 | BIOerr(BIO_F_CONN_STATE, |
| 218 | BIOerr(BIO_F_CONN_STATE,BIO_R_UNABLE_TO_CREATE_SOCKET); | 207 | BIO_R_UNABLE_TO_CREATE_SOCKET); |
| 219 | goto exit_loop; | 208 | goto exit_loop; |
| 220 | } | 209 | } |
| 221 | b->num=ret; | 210 | b->num = ret; |
| 222 | c->state=BIO_CONN_S_NBIO; | 211 | c->state = BIO_CONN_S_NBIO; |
| 223 | break; | 212 | break; |
| 224 | 213 | ||
| 225 | case BIO_CONN_S_NBIO: | 214 | case BIO_CONN_S_NBIO: |
| 226 | if (c->nbio) | 215 | if (c->nbio) { |
| 227 | { | 216 | if (!BIO_socket_nbio(b->num, 1)) { |
| 228 | if (!BIO_socket_nbio(b->num,1)) | 217 | BIOerr(BIO_F_CONN_STATE, |
| 229 | { | 218 | BIO_R_ERROR_SETTING_NBIO); |
| 230 | BIOerr(BIO_F_CONN_STATE,BIO_R_ERROR_SETTING_NBIO); | 219 | ERR_add_error_data(4, "host=", |
| 231 | ERR_add_error_data(4,"host=", | 220 | c->param_hostname, ":", |
| 232 | c->param_hostname, | 221 | c->param_port); |
| 233 | ":",c->param_port); | ||
| 234 | goto exit_loop; | 222 | goto exit_loop; |
| 235 | } | ||
| 236 | } | 223 | } |
| 237 | c->state=BIO_CONN_S_CONNECT; | 224 | } |
| 225 | c->state = BIO_CONN_S_CONNECT; | ||
| 238 | 226 | ||
| 239 | #if defined(SO_KEEPALIVE) && !defined(OPENSSL_SYS_MPE) | 227 | #if defined(SO_KEEPALIVE) && !defined(OPENSSL_SYS_MPE) |
| 240 | i=1; | 228 | i = 1; |
| 241 | i=setsockopt(b->num,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); | 229 | i = setsockopt(b->num, SOL_SOCKET, SO_KEEPALIVE,(char *)&i, sizeof(i)); |
| 242 | if (i < 0) | 230 | if (i < 0) { |
| 243 | { | 231 | SYSerr(SYS_F_SOCKET, errno); |
| 244 | SYSerr(SYS_F_SOCKET,errno); | 232 | ERR_add_error_data(4, "host=", |
| 245 | ERR_add_error_data(4,"host=",c->param_hostname, | 233 | c->param_hostname, ":", c->param_port); |
| 246 | ":",c->param_port); | 234 | BIOerr(BIO_F_CONN_STATE, BIO_R_KEEPALIVE); |
| 247 | BIOerr(BIO_F_CONN_STATE,BIO_R_KEEPALIVE); | ||
| 248 | goto exit_loop; | 235 | goto exit_loop; |
| 249 | } | 236 | } |
| 250 | #endif | 237 | #endif |
| 251 | break; | 238 | break; |
| 252 | 239 | ||
| 253 | case BIO_CONN_S_CONNECT: | 240 | case BIO_CONN_S_CONNECT: |
| 254 | BIO_clear_retry_flags(b); | 241 | BIO_clear_retry_flags(b); |
| 255 | ret=connect(b->num, | 242 | ret = connect(b->num, |
| 256 | (struct sockaddr *)&c->them, | 243 | (struct sockaddr *)&c->them, |
| 257 | sizeof(c->them)); | 244 | sizeof(c->them)); |
| 258 | b->retry_reason=0; | 245 | b->retry_reason = 0; |
| 259 | if (ret < 0) | 246 | if (ret < 0) { |
| 260 | { | 247 | if (BIO_sock_should_retry(ret)) { |
| 261 | if (BIO_sock_should_retry(ret)) | ||
| 262 | { | ||
| 263 | BIO_set_retry_special(b); | 248 | BIO_set_retry_special(b); |
| 264 | c->state=BIO_CONN_S_BLOCKED_CONNECT; | 249 | c->state = BIO_CONN_S_BLOCKED_CONNECT; |
| 265 | b->retry_reason=BIO_RR_CONNECT; | 250 | b->retry_reason = BIO_RR_CONNECT; |
| 266 | } | 251 | } else { |
| 267 | else | 252 | SYSerr(SYS_F_CONNECT, errno); |
| 268 | { | 253 | ERR_add_error_data(4, "host=", |
| 269 | SYSerr(SYS_F_CONNECT,errno); | 254 | c->param_hostname, ":", |
| 270 | ERR_add_error_data(4,"host=", | 255 | c->param_port); |
| 271 | c->param_hostname, | 256 | BIOerr(BIO_F_CONN_STATE, |
| 272 | ":",c->param_port); | 257 | BIO_R_CONNECT_ERROR); |
| 273 | BIOerr(BIO_F_CONN_STATE,BIO_R_CONNECT_ERROR); | ||
| 274 | } | ||
| 275 | goto exit_loop; | ||
| 276 | } | 258 | } |
| 277 | else | 259 | goto exit_loop; |
| 278 | c->state=BIO_CONN_S_OK; | 260 | } else |
| 261 | c->state = BIO_CONN_S_OK; | ||
| 279 | break; | 262 | break; |
| 280 | 263 | ||
| 281 | case BIO_CONN_S_BLOCKED_CONNECT: | 264 | case BIO_CONN_S_BLOCKED_CONNECT: |
| 282 | i=BIO_sock_error(b->num); | 265 | i = BIO_sock_error(b->num); |
| 283 | if (i) | 266 | if (i) { |
| 284 | { | ||
| 285 | BIO_clear_retry_flags(b); | 267 | BIO_clear_retry_flags(b); |
| 286 | SYSerr(SYS_F_CONNECT,i); | 268 | SYSerr(SYS_F_CONNECT, i); |
| 287 | ERR_add_error_data(4,"host=", | 269 | ERR_add_error_data(4, "host=", |
| 288 | c->param_hostname, | 270 | c->param_hostname, ":", c->param_port); |
| 289 | ":",c->param_port); | 271 | BIOerr(BIO_F_CONN_STATE, |
| 290 | BIOerr(BIO_F_CONN_STATE,BIO_R_NBIO_CONNECT_ERROR); | 272 | BIO_R_NBIO_CONNECT_ERROR); |
| 291 | ret=0; | 273 | ret = 0; |
| 292 | goto exit_loop; | 274 | goto exit_loop; |
| 293 | } | 275 | } else |
| 294 | else | 276 | c->state = BIO_CONN_S_OK; |
| 295 | c->state=BIO_CONN_S_OK; | ||
| 296 | break; | 277 | break; |
| 297 | 278 | ||
| 298 | case BIO_CONN_S_OK: | 279 | case BIO_CONN_S_OK: |
| 299 | ret=1; | 280 | ret = 1; |
| 300 | goto exit_loop; | 281 | goto exit_loop; |
| 301 | default: | 282 | default: |
| 302 | /* abort(); */ | 283 | /* abort(); */ |
| 303 | goto exit_loop; | 284 | goto exit_loop; |
| 304 | } | 285 | } |
| 305 | 286 | ||
| 306 | if (cb != NULL) | 287 | if (cb != NULL) { |
| 307 | { | 288 | if (!(ret = cb((BIO *)b, c->state, ret))) |
| 308 | if (!(ret=cb((BIO *)b,c->state,ret))) | ||
| 309 | goto end; | 289 | goto end; |
| 310 | } | ||
| 311 | } | 290 | } |
| 291 | } | ||
| 312 | 292 | ||
| 313 | /* Loop does not exit */ | 293 | /* Loop does not exit */ |
| 314 | exit_loop: | 294 | exit_loop: |
| 315 | if (cb != NULL) | 295 | if (cb != NULL) |
| 316 | ret=cb((BIO *)b,c->state,ret); | 296 | ret = cb((BIO *)b, c->state, ret); |
| 317 | end: | 297 | end: |
| 318 | return(ret); | 298 | return (ret); |
| 319 | } | 299 | } |
| 320 | 300 | ||
| 321 | BIO_CONNECT *BIO_CONNECT_new(void) | 301 | BIO_CONNECT |
| 322 | { | 302 | *BIO_CONNECT_new(void) |
| 303 | { | ||
| 323 | BIO_CONNECT *ret; | 304 | BIO_CONNECT *ret; |
| 324 | 305 | ||
| 325 | if ((ret=(BIO_CONNECT *)OPENSSL_malloc(sizeof(BIO_CONNECT))) == NULL) | 306 | if ((ret = (BIO_CONNECT *)OPENSSL_malloc(sizeof(BIO_CONNECT))) == NULL) |
| 326 | return(NULL); | 307 | return (NULL); |
| 327 | ret->state=BIO_CONN_S_BEFORE; | 308 | ret->state = BIO_CONN_S_BEFORE; |
| 328 | ret->param_hostname=NULL; | 309 | ret->param_hostname = NULL; |
| 329 | ret->param_port=NULL; | 310 | ret->param_port = NULL; |
| 330 | ret->info_callback=NULL; | 311 | ret->info_callback = NULL; |
| 331 | ret->nbio=0; | 312 | ret->nbio = 0; |
| 332 | ret->ip[0]=0; | 313 | ret->ip[0] = 0; |
| 333 | ret->ip[1]=0; | 314 | ret->ip[1] = 0; |
| 334 | ret->ip[2]=0; | 315 | ret->ip[2] = 0; |
| 335 | ret->ip[3]=0; | 316 | ret->ip[3] = 0; |
| 336 | ret->port=0; | 317 | ret->port = 0; |
| 337 | memset((char *)&ret->them,0,sizeof(ret->them)); | 318 | memset((char *)&ret->them, 0, sizeof(ret->them)); |
| 338 | return(ret); | 319 | return (ret); |
| 339 | } | 320 | } |
| 340 | 321 | ||
| 341 | void BIO_CONNECT_free(BIO_CONNECT *a) | 322 | void |
| 342 | { | 323 | BIO_CONNECT_free(BIO_CONNECT *a) |
| 343 | if(a == NULL) | 324 | { |
| 344 | return; | 325 | if (a == NULL) |
| 326 | return; | ||
| 345 | 327 | ||
| 346 | if (a->param_hostname != NULL) | 328 | if (a->param_hostname != NULL) |
| 347 | OPENSSL_free(a->param_hostname); | 329 | OPENSSL_free(a->param_hostname); |
| 348 | if (a->param_port != NULL) | 330 | if (a->param_port != NULL) |
| 349 | OPENSSL_free(a->param_port); | 331 | OPENSSL_free(a->param_port); |
| 350 | OPENSSL_free(a); | 332 | OPENSSL_free(a); |
| 351 | } | 333 | } |
| 352 | 334 | ||
| 353 | BIO_METHOD *BIO_s_connect(void) | 335 | BIO_METHOD |
| 354 | { | 336 | *BIO_s_connect(void) |
| 355 | return(&methods_connectp); | 337 | { |
| 356 | } | 338 | return (&methods_connectp); |
| 357 | 339 | } | |
| 358 | static int conn_new(BIO *bi) | 340 | |
| 359 | { | 341 | static int |
| 360 | bi->init=0; | 342 | conn_new(BIO *bi) |
| 361 | bi->num=-1; | 343 | { |
| 362 | bi->flags=0; | 344 | bi->init = 0; |
| 363 | if ((bi->ptr=(char *)BIO_CONNECT_new()) == NULL) | 345 | bi->num = -1; |
| 364 | return(0); | 346 | bi->flags = 0; |
| 347 | if ((bi->ptr = (char *)BIO_CONNECT_new()) == NULL) | ||
| 348 | return (0); | ||
| 365 | else | 349 | else |
| 366 | return(1); | 350 | return (1); |
| 367 | } | 351 | } |
| 368 | 352 | ||
| 369 | static void conn_close_socket(BIO *bio) | 353 | static void |
| 370 | { | 354 | conn_close_socket(BIO *bio) |
| 355 | { | ||
| 371 | BIO_CONNECT *c; | 356 | BIO_CONNECT *c; |
| 372 | 357 | ||
| 373 | c=(BIO_CONNECT *)bio->ptr; | 358 | c = (BIO_CONNECT *)bio->ptr; |
| 374 | if (bio->num != -1) | 359 | if (bio->num != -1) { |
| 375 | { | ||
| 376 | /* Only do a shutdown if things were established */ | 360 | /* Only do a shutdown if things were established */ |
| 377 | if (c->state == BIO_CONN_S_OK) | 361 | if (c->state == BIO_CONN_S_OK) |
| 378 | shutdown(bio->num, SHUT_RDWR); | 362 | shutdown(bio->num, SHUT_RDWR); |
| 379 | close(bio->num); | 363 | close(bio->num); |
| 380 | bio->num=-1; | 364 | bio->num = -1; |
| 381 | } | ||
| 382 | } | 365 | } |
| 366 | } | ||
| 383 | 367 | ||
| 384 | static int conn_free(BIO *a) | 368 | static int |
| 385 | { | 369 | conn_free(BIO *a) |
| 370 | { | ||
| 386 | BIO_CONNECT *data; | 371 | BIO_CONNECT *data; |
| 387 | 372 | ||
| 388 | if (a == NULL) return(0); | 373 | if (a == NULL) |
| 389 | data=(BIO_CONNECT *)a->ptr; | 374 | return (0); |
| 390 | 375 | data = (BIO_CONNECT *)a->ptr; | |
| 391 | if (a->shutdown) | 376 | |
| 392 | { | 377 | if (a->shutdown) { |
| 393 | conn_close_socket(a); | 378 | conn_close_socket(a); |
| 394 | BIO_CONNECT_free(data); | 379 | BIO_CONNECT_free(data); |
| 395 | a->ptr=NULL; | 380 | a->ptr = NULL; |
| 396 | a->flags=0; | 381 | a->flags = 0; |
| 397 | a->init=0; | 382 | a->init = 0; |
| 398 | } | ||
| 399 | return(1); | ||
| 400 | } | 383 | } |
| 401 | 384 | return (1); | |
| 402 | static int conn_read(BIO *b, char *out, int outl) | 385 | } |
| 403 | { | 386 | |
| 404 | int ret=0; | 387 | static int |
| 388 | conn_read(BIO *b, char *out, int outl) | ||
| 389 | { | ||
| 390 | int ret = 0; | ||
| 405 | BIO_CONNECT *data; | 391 | BIO_CONNECT *data; |
| 406 | 392 | ||
| 407 | data=(BIO_CONNECT *)b->ptr; | 393 | data = (BIO_CONNECT *)b->ptr; |
| 408 | if (data->state != BIO_CONN_S_OK) | 394 | if (data->state != BIO_CONN_S_OK) { |
| 409 | { | 395 | ret = conn_state(b, data); |
| 410 | ret=conn_state(b,data); | ||
| 411 | if (ret <= 0) | 396 | if (ret <= 0) |
| 412 | return(ret); | 397 | return (ret); |
| 413 | } | 398 | } |
| 414 | 399 | ||
| 415 | if (out != NULL) | 400 | if (out != NULL) { |
| 416 | { | ||
| 417 | errno = 0; | 401 | errno = 0; |
| 418 | ret=read(b->num,out,outl); | 402 | ret = read(b->num, out, outl); |
| 419 | BIO_clear_retry_flags(b); | 403 | BIO_clear_retry_flags(b); |
| 420 | if (ret <= 0) | 404 | if (ret <= 0) { |
| 421 | { | ||
| 422 | if (BIO_sock_should_retry(ret)) | 405 | if (BIO_sock_should_retry(ret)) |
| 423 | BIO_set_retry_read(b); | 406 | BIO_set_retry_read(b); |
| 424 | } | ||
| 425 | } | 407 | } |
| 426 | return(ret); | ||
| 427 | } | 408 | } |
| 409 | return (ret); | ||
| 410 | } | ||
| 428 | 411 | ||
| 429 | static int conn_write(BIO *b, const char *in, int inl) | 412 | static int |
| 430 | { | 413 | conn_write(BIO *b, const char *in, int inl) |
| 414 | { | ||
| 431 | int ret; | 415 | int ret; |
| 432 | BIO_CONNECT *data; | 416 | BIO_CONNECT *data; |
| 433 | 417 | ||
| 434 | data=(BIO_CONNECT *)b->ptr; | 418 | data = (BIO_CONNECT *)b->ptr; |
| 435 | if (data->state != BIO_CONN_S_OK) | 419 | if (data->state != BIO_CONN_S_OK) { |
| 436 | { | 420 | ret = conn_state(b, data); |
| 437 | ret=conn_state(b,data); | 421 | if (ret <= 0) |
| 438 | if (ret <= 0) return(ret); | 422 | return (ret); |
| 439 | } | 423 | } |
| 440 | 424 | ||
| 441 | errno = 0; | 425 | errno = 0; |
| 442 | ret=write(b->num,in,inl); | 426 | ret = write(b->num, in, inl); |
| 443 | BIO_clear_retry_flags(b); | 427 | BIO_clear_retry_flags(b); |
| 444 | if (ret <= 0) | 428 | if (ret <= 0) { |
| 445 | { | ||
| 446 | if (BIO_sock_should_retry(ret)) | 429 | if (BIO_sock_should_retry(ret)) |
| 447 | BIO_set_retry_write(b); | 430 | BIO_set_retry_write(b); |
| 448 | } | ||
| 449 | return(ret); | ||
| 450 | } | 431 | } |
| 432 | return (ret); | ||
| 433 | } | ||
| 451 | 434 | ||
| 452 | static long conn_ctrl(BIO *b, int cmd, long num, void *ptr) | 435 | static long |
| 453 | { | 436 | conn_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 437 | { | ||
| 454 | BIO *dbio; | 438 | BIO *dbio; |
| 455 | int *ip; | 439 | int *ip; |
| 456 | const char **pptr; | 440 | const char **pptr; |
| 457 | long ret=1; | 441 | long ret = 1; |
| 458 | BIO_CONNECT *data; | 442 | BIO_CONNECT *data; |
| 459 | 443 | ||
| 460 | data=(BIO_CONNECT *)b->ptr; | 444 | data = (BIO_CONNECT *)b->ptr; |
| 461 | 445 | ||
| 462 | switch (cmd) | 446 | switch (cmd) { |
| 463 | { | ||
| 464 | case BIO_CTRL_RESET: | 447 | case BIO_CTRL_RESET: |
| 465 | ret=0; | 448 | ret = 0; |
| 466 | data->state=BIO_CONN_S_BEFORE; | 449 | data->state = BIO_CONN_S_BEFORE; |
| 467 | conn_close_socket(b); | 450 | conn_close_socket(b); |
| 468 | b->flags=0; | 451 | b->flags = 0; |
| 469 | break; | 452 | break; |
| 470 | case BIO_C_DO_STATE_MACHINE: | 453 | case BIO_C_DO_STATE_MACHINE: |
| 471 | /* use this one to start the connection */ | 454 | /* use this one to start the connection */ |
| 472 | if (data->state != BIO_CONN_S_OK) | 455 | if (data->state != BIO_CONN_S_OK) |
| 473 | ret=(long)conn_state(b,data); | 456 | ret = (long)conn_state(b, data); |
| 474 | else | 457 | else |
| 475 | ret=1; | 458 | ret = 1; |
| 476 | break; | 459 | break; |
| 477 | case BIO_C_GET_CONNECT: | 460 | case BIO_C_GET_CONNECT: |
| 478 | if (ptr != NULL) | 461 | if (ptr != NULL) { |
| 479 | { | 462 | pptr = (const char **)ptr; |
| 480 | pptr=(const char **)ptr; | 463 | if (num == 0) { |
| 481 | if (num == 0) | 464 | *pptr = data->param_hostname; |
| 482 | { | 465 | |
| 483 | *pptr=data->param_hostname; | 466 | } else if (num == 1) { |
| 484 | 467 | *pptr = data->param_port; | |
| 485 | } | 468 | } else if (num == 2) { |
| 486 | else if (num == 1) | 469 | *pptr = (char *)&(data->ip[0]); |
| 487 | { | 470 | } else if (num == 3) { |
| 488 | *pptr=data->param_port; | 471 | *((int *)ptr) = data->port; |
| 489 | } | ||
| 490 | else if (num == 2) | ||
| 491 | { | ||
| 492 | *pptr= (char *)&(data->ip[0]); | ||
| 493 | } | ||
| 494 | else if (num == 3) | ||
| 495 | { | ||
| 496 | *((int *)ptr)=data->port; | ||
| 497 | } | ||
| 498 | if ((!b->init) || (ptr == NULL)) | ||
| 499 | *pptr="not initialized"; | ||
| 500 | ret=1; | ||
| 501 | } | 472 | } |
| 473 | if ((!b->init) || (ptr == NULL)) | ||
| 474 | *pptr = "not initialized"; | ||
| 475 | ret = 1; | ||
| 476 | } | ||
| 502 | break; | 477 | break; |
| 503 | case BIO_C_SET_CONNECT: | 478 | case BIO_C_SET_CONNECT: |
| 504 | if (ptr != NULL) | 479 | if (ptr != NULL) { |
| 505 | { | 480 | b->init = 1; |
| 506 | b->init=1; | 481 | if (num == 0) { |
| 507 | if (num == 0) | ||
| 508 | { | ||
| 509 | if (data->param_hostname != NULL) | 482 | if (data->param_hostname != NULL) |
| 510 | OPENSSL_free(data->param_hostname); | 483 | OPENSSL_free(data->param_hostname); |
| 511 | data->param_hostname=BUF_strdup(ptr); | 484 | data->param_hostname = BUF_strdup(ptr); |
| 512 | } | 485 | } else if (num == 1) { |
| 513 | else if (num == 1) | ||
| 514 | { | ||
| 515 | if (data->param_port != NULL) | 486 | if (data->param_port != NULL) |
| 516 | OPENSSL_free(data->param_port); | 487 | OPENSSL_free(data->param_port); |
| 517 | data->param_port=BUF_strdup(ptr); | 488 | data->param_port = BUF_strdup(ptr); |
| 518 | } | 489 | } else if (num == 2) { |
| 519 | else if (num == 2) | ||
| 520 | { | ||
| 521 | char buf[16]; | 490 | char buf[16]; |
| 522 | unsigned char *p = ptr; | 491 | unsigned char *p = ptr; |
| 523 | 492 | ||
| 524 | (void) snprintf(buf,sizeof buf,"%d.%d.%d.%d", | 493 | (void) snprintf(buf, sizeof buf, "%d.%d.%d.%d", |
| 525 | p[0],p[1],p[2],p[3]); | 494 | p[0], p[1], p[2], p[3]); |
| 526 | if (data->param_hostname != NULL) | 495 | if (data->param_hostname != NULL) |
| 527 | OPENSSL_free(data->param_hostname); | 496 | OPENSSL_free(data->param_hostname); |
| 528 | data->param_hostname=BUF_strdup(buf); | 497 | data->param_hostname = BUF_strdup(buf); |
| 529 | memcpy(&(data->ip[0]),ptr,4); | 498 | memcpy(&(data->ip[0]), ptr, 4); |
| 530 | } | 499 | } else if (num == 3) { |
| 531 | else if (num == 3) | 500 | char buf[DECIMAL_SIZE(int) + 1]; |
| 532 | { | ||
| 533 | char buf[DECIMAL_SIZE(int)+1]; | ||
| 534 | 501 | ||
| 535 | (void) snprintf(buf,sizeof buf,"%d",*(int *)ptr); | 502 | (void) snprintf(buf, sizeof buf, "%d", |
| 503 | *(int *)ptr); | ||
| 536 | if (data->param_port != NULL) | 504 | if (data->param_port != NULL) |
| 537 | OPENSSL_free(data->param_port); | 505 | OPENSSL_free(data->param_port); |
| 538 | data->param_port=BUF_strdup(buf); | 506 | data->param_port = BUF_strdup(buf); |
| 539 | data->port= *(int *)ptr; | 507 | data->port= *(int *)ptr; |
| 540 | } | ||
| 541 | } | 508 | } |
| 509 | } | ||
| 542 | break; | 510 | break; |
| 543 | case BIO_C_SET_NBIO: | 511 | case BIO_C_SET_NBIO: |
| 544 | data->nbio=(int)num; | 512 | data->nbio = (int)num; |
| 545 | break; | 513 | break; |
| 546 | case BIO_C_GET_FD: | 514 | case BIO_C_GET_FD: |
| 547 | if (b->init) | 515 | if (b->init) { |
| 548 | { | 516 | ip = (int *)ptr; |
| 549 | ip=(int *)ptr; | ||
| 550 | if (ip != NULL) | 517 | if (ip != NULL) |
| 551 | *ip=b->num; | 518 | *ip = b->num; |
| 552 | ret=b->num; | 519 | ret = b->num; |
| 553 | } | 520 | } else |
| 554 | else | 521 | ret = -1; |
| 555 | ret= -1; | ||
| 556 | break; | 522 | break; |
| 557 | case BIO_CTRL_GET_CLOSE: | 523 | case BIO_CTRL_GET_CLOSE: |
| 558 | ret=b->shutdown; | 524 | ret = b->shutdown; |
| 559 | break; | 525 | break; |
| 560 | case BIO_CTRL_SET_CLOSE: | 526 | case BIO_CTRL_SET_CLOSE: |
| 561 | b->shutdown=(int)num; | 527 | b->shutdown = (int)num; |
| 562 | break; | 528 | break; |
| 563 | case BIO_CTRL_PENDING: | 529 | case BIO_CTRL_PENDING: |
| 564 | case BIO_CTRL_WPENDING: | 530 | case BIO_CTRL_WPENDING: |
| 565 | ret=0; | 531 | ret = 0; |
| 566 | break; | 532 | break; |
| 567 | case BIO_CTRL_FLUSH: | 533 | case BIO_CTRL_FLUSH: |
| 568 | break; | 534 | break; |
| 569 | case BIO_CTRL_DUP: | 535 | case BIO_CTRL_DUP: |
| 570 | { | 536 | { |
| 571 | dbio=(BIO *)ptr; | 537 | dbio = (BIO *)ptr; |
| 572 | if (data->param_port) | 538 | if (data->param_port) |
| 573 | BIO_set_conn_port(dbio,data->param_port); | 539 | BIO_set_conn_port(dbio, data->param_port); |
| 574 | if (data->param_hostname) | 540 | if (data->param_hostname) |
| 575 | BIO_set_conn_hostname(dbio,data->param_hostname); | 541 | BIO_set_conn_hostname(dbio, |
| 576 | BIO_set_nbio(dbio,data->nbio); | 542 | data->param_hostname); |
| 577 | /* FIXME: the cast of the function seems unlikely to be a good idea */ | 543 | BIO_set_nbio(dbio, data->nbio); |
| 578 | (void)BIO_set_info_callback(dbio,(bio_info_cb *)data->info_callback); | 544 | /* FIXME: the cast of the function seems unlikely to be a good idea */ |
| 545 | (void)BIO_set_info_callback(dbio, | ||
| 546 | (bio_info_cb *)data->info_callback); | ||
| 579 | } | 547 | } |
| 580 | break; | 548 | break; |
| 581 | case BIO_CTRL_SET_CALLBACK: | 549 | case BIO_CTRL_SET_CALLBACK: |
| 582 | { | 550 | { |
| 583 | #if 0 /* FIXME: Should this be used? -- Richard Levitte */ | 551 | #if 0 /* FIXME: Should this be used? -- Richard Levitte */ |
| 584 | BIOerr(BIO_F_CONN_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 552 | BIOerr(BIO_F_CONN_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
| 585 | ret = -1; | 553 | ret = -1; |
| 586 | #else | 554 | #else |
| 587 | ret=0; | 555 | ret = 0; |
| 588 | #endif | 556 | #endif |
| 589 | } | 557 | } |
| 590 | break; | 558 | break; |
| 591 | case BIO_CTRL_GET_CALLBACK: | 559 | case BIO_CTRL_GET_CALLBACK: |
| 592 | { | 560 | { |
| 593 | int (**fptr)(const BIO *bio,int state,int xret); | 561 | int (**fptr)(const BIO *bio, int state, int xret); |
| 594 | 562 | ||
| 595 | fptr=(int (**)(const BIO *bio,int state,int xret))ptr; | 563 | fptr = (int (**)(const BIO *bio, int state, int xret))ptr; |
| 596 | *fptr=data->info_callback; | 564 | *fptr = data->info_callback; |
| 597 | } | 565 | } |
| 598 | break; | 566 | break; |
| 599 | default: | 567 | default: |
| 600 | ret=0; | 568 | ret = 0; |
| 601 | break; | 569 | break; |
| 602 | } | ||
| 603 | return(ret); | ||
| 604 | } | 570 | } |
| 571 | return (ret); | ||
| 572 | } | ||
| 605 | 573 | ||
| 606 | static long conn_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) | 574 | static long |
| 607 | { | 575 | conn_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 608 | long ret=1; | 576 | { |
| 577 | long ret = 1; | ||
| 609 | BIO_CONNECT *data; | 578 | BIO_CONNECT *data; |
| 610 | 579 | ||
| 611 | data=(BIO_CONNECT *)b->ptr; | 580 | data = (BIO_CONNECT *)b->ptr; |
| 612 | 581 | ||
| 613 | switch (cmd) | 582 | switch (cmd) { |
| 614 | { | ||
| 615 | case BIO_CTRL_SET_CALLBACK: | 583 | case BIO_CTRL_SET_CALLBACK: |
| 616 | { | 584 | { |
| 617 | data->info_callback=(int (*)(const struct bio_st *, int, int))fp; | 585 | data->info_callback = (int (*)(const struct bio_st *, int, int))fp; |
| 618 | } | 586 | } |
| 619 | break; | 587 | break; |
| 620 | default: | 588 | default: |
| 621 | ret=0; | 589 | ret = 0; |
| 622 | break; | 590 | break; |
| 623 | } | ||
| 624 | return(ret); | ||
| 625 | } | 591 | } |
| 626 | 592 | return (ret); | |
| 627 | static int conn_puts(BIO *bp, const char *str) | 593 | } |
| 628 | { | 594 | |
| 629 | int n,ret; | 595 | static int |
| 630 | 596 | conn_puts(BIO *bp, const char *str) | |
| 631 | n=strlen(str); | 597 | { |
| 632 | ret=conn_write(bp,str,n); | 598 | int n, ret; |
| 633 | return(ret); | 599 | |
| 634 | } | 600 | n = strlen(str); |
| 635 | 601 | ret = conn_write(bp, str, n); | |
| 636 | BIO *BIO_new_connect(char *str) | 602 | return (ret); |
| 637 | { | 603 | } |
| 604 | |||
| 605 | BIO | ||
| 606 | *BIO_new_connect(char *str) | ||
| 607 | { | ||
| 638 | BIO *ret; | 608 | BIO *ret; |
| 639 | 609 | ||
| 640 | ret=BIO_new(BIO_s_connect()); | 610 | ret = BIO_new(BIO_s_connect()); |
| 641 | if (ret == NULL) return(NULL); | 611 | if (ret == NULL) |
| 642 | if (BIO_set_conn_hostname(ret,str)) | 612 | return (NULL); |
| 643 | return(ret); | 613 | if (BIO_set_conn_hostname(ret, str)) |
| 644 | else | 614 | return (ret); |
| 645 | { | 615 | else { |
| 646 | BIO_free(ret); | 616 | BIO_free(ret); |
| 647 | return(NULL); | 617 | return (NULL); |
| 648 | } | ||
| 649 | } | 618 | } |
| 619 | } | ||
| 650 | 620 | ||
| 651 | #endif | 621 | #endif |
| 652 | |||
diff --git a/src/lib/libcrypto/bio/bss_dgram.c b/src/lib/libcrypto/bio/bss_dgram.c index 67a13ae845..330f6fc404 100644 --- a/src/lib/libcrypto/bio/bss_dgram.c +++ b/src/lib/libcrypto/bio/bss_dgram.c | |||
| @@ -113,7 +113,8 @@ static long dgram_sctp_ctrl(BIO *h, int cmd, long arg1, void *arg2); | |||
| 113 | static int dgram_sctp_new(BIO *h); | 113 | static int dgram_sctp_new(BIO *h); |
| 114 | static int dgram_sctp_free(BIO *data); | 114 | static int dgram_sctp_free(BIO *data); |
| 115 | #ifdef SCTP_AUTHENTICATION_EVENT | 115 | #ifdef SCTP_AUTHENTICATION_EVENT |
| 116 | static void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp); | 116 | static void dgram_sctp_handle_auth_free_key_event(BIO *b, |
| 117 | union sctp_notification *snp); | ||
| 117 | #endif | 118 | #endif |
| 118 | #endif | 119 | #endif |
| 119 | 120 | ||
| @@ -121,8 +122,7 @@ static int BIO_dgram_should_retry(int s); | |||
| 121 | 122 | ||
| 122 | static void get_current_time(struct timeval *t); | 123 | static void get_current_time(struct timeval *t); |
| 123 | 124 | ||
| 124 | static BIO_METHOD methods_dgramp= | 125 | static BIO_METHOD methods_dgramp = { |
| 125 | { | ||
| 126 | BIO_TYPE_DGRAM, | 126 | BIO_TYPE_DGRAM, |
| 127 | "datagram socket", | 127 | "datagram socket", |
| 128 | dgram_write, | 128 | dgram_write, |
| @@ -133,11 +133,10 @@ static BIO_METHOD methods_dgramp= | |||
| 133 | dgram_new, | 133 | dgram_new, |
| 134 | dgram_free, | 134 | dgram_free, |
| 135 | NULL, | 135 | NULL, |
| 136 | }; | 136 | }; |
| 137 | 137 | ||
| 138 | #ifndef OPENSSL_NO_SCTP | 138 | #ifndef OPENSSL_NO_SCTP |
| 139 | static BIO_METHOD methods_dgramp_sctp= | 139 | static BIO_METHOD methods_dgramp_sctp = { |
| 140 | { | ||
| 141 | BIO_TYPE_DGRAM_SCTP, | 140 | BIO_TYPE_DGRAM_SCTP, |
| 142 | "datagram sctp socket", | 141 | "datagram sctp socket", |
| 143 | dgram_sctp_write, | 142 | dgram_sctp_write, |
| @@ -148,11 +147,10 @@ static BIO_METHOD methods_dgramp_sctp= | |||
| 148 | dgram_sctp_new, | 147 | dgram_sctp_new, |
| 149 | dgram_sctp_free, | 148 | dgram_sctp_free, |
| 150 | NULL, | 149 | NULL, |
| 151 | }; | 150 | }; |
| 152 | #endif | 151 | #endif |
| 153 | 152 | ||
| 154 | typedef struct bio_dgram_data_st | 153 | typedef struct bio_dgram_data_st { |
| 155 | { | ||
| 156 | union { | 154 | union { |
| 157 | struct sockaddr sa; | 155 | struct sockaddr sa; |
| 158 | struct sockaddr_in sa_in; | 156 | struct sockaddr_in sa_in; |
| @@ -165,18 +163,16 @@ typedef struct bio_dgram_data_st | |||
| 165 | unsigned int mtu; | 163 | unsigned int mtu; |
| 166 | struct timeval next_timeout; | 164 | struct timeval next_timeout; |
| 167 | struct timeval socket_timeout; | 165 | struct timeval socket_timeout; |
| 168 | } bio_dgram_data; | 166 | } bio_dgram_data; |
| 169 | 167 | ||
| 170 | #ifndef OPENSSL_NO_SCTP | 168 | #ifndef OPENSSL_NO_SCTP |
| 171 | typedef struct bio_dgram_sctp_save_message_st | 169 | typedef struct bio_dgram_sctp_save_message_st { |
| 172 | { | 170 | BIO *bio; |
| 173 | BIO *bio; | 171 | char *data; |
| 174 | char *data; | 172 | int length; |
| 175 | int length; | 173 | } bio_dgram_sctp_save_message; |
| 176 | } bio_dgram_sctp_save_message; | ||
| 177 | 174 | ||
| 178 | typedef struct bio_dgram_sctp_data_st | 175 | typedef struct bio_dgram_sctp_data_st { |
| 179 | { | ||
| 180 | union { | 176 | union { |
| 181 | struct sockaddr sa; | 177 | struct sockaddr sa; |
| 182 | struct sockaddr_in sa_in; | 178 | struct sockaddr_in sa_in; |
| @@ -198,79 +194,88 @@ typedef struct bio_dgram_sctp_data_st | |||
| 198 | int save_shutdown; | 194 | int save_shutdown; |
| 199 | int peer_auth_tested; | 195 | int peer_auth_tested; |
| 200 | bio_dgram_sctp_save_message saved_message; | 196 | bio_dgram_sctp_save_message saved_message; |
| 201 | } bio_dgram_sctp_data; | 197 | } bio_dgram_sctp_data; |
| 202 | #endif | 198 | #endif |
| 203 | 199 | ||
| 204 | BIO_METHOD *BIO_s_datagram(void) | 200 | BIO_METHOD |
| 205 | { | 201 | *BIO_s_datagram(void) |
| 206 | return(&methods_dgramp); | 202 | { |
| 207 | } | 203 | return (&methods_dgramp); |
| 204 | } | ||
| 208 | 205 | ||
| 209 | BIO *BIO_new_dgram(int fd, int close_flag) | 206 | BIO |
| 210 | { | 207 | *BIO_new_dgram(int fd, int close_flag) |
| 208 | { | ||
| 211 | BIO *ret; | 209 | BIO *ret; |
| 212 | 210 | ||
| 213 | ret=BIO_new(BIO_s_datagram()); | 211 | ret = BIO_new(BIO_s_datagram()); |
| 214 | if (ret == NULL) return(NULL); | 212 | if (ret == NULL) |
| 215 | BIO_set_fd(ret,fd,close_flag); | 213 | return (NULL); |
| 216 | return(ret); | 214 | BIO_set_fd(ret, fd, close_flag); |
| 217 | } | 215 | return (ret); |
| 216 | } | ||
| 218 | 217 | ||
| 219 | static int dgram_new(BIO *bi) | 218 | static int |
| 220 | { | 219 | dgram_new(BIO *bi) |
| 220 | { | ||
| 221 | bio_dgram_data *data = NULL; | 221 | bio_dgram_data *data = NULL; |
| 222 | 222 | ||
| 223 | bi->init=0; | 223 | bi->init = 0; |
| 224 | bi->num=0; | 224 | bi->num = 0; |
| 225 | data = OPENSSL_malloc(sizeof(bio_dgram_data)); | 225 | data = OPENSSL_malloc(sizeof(bio_dgram_data)); |
| 226 | if (data == NULL) | 226 | if (data == NULL) |
| 227 | return 0; | 227 | return 0; |
| 228 | memset(data, 0x00, sizeof(bio_dgram_data)); | 228 | memset(data, 0x00, sizeof(bio_dgram_data)); |
| 229 | bi->ptr = data; | 229 | bi->ptr = data; |
| 230 | 230 | ||
| 231 | bi->flags=0; | 231 | bi->flags = 0; |
| 232 | return(1); | 232 | return (1); |
| 233 | } | 233 | } |
| 234 | 234 | ||
| 235 | static int dgram_free(BIO *a) | 235 | static int |
| 236 | { | 236 | dgram_free(BIO *a) |
| 237 | { | ||
| 237 | bio_dgram_data *data; | 238 | bio_dgram_data *data; |
| 238 | 239 | ||
| 239 | if (a == NULL) return(0); | 240 | if (a == NULL) |
| 240 | if ( ! dgram_clear(a)) | 241 | return (0); |
| 242 | if (!dgram_clear(a)) | ||
| 241 | return 0; | 243 | return 0; |
| 242 | 244 | ||
| 243 | data = (bio_dgram_data *)a->ptr; | 245 | data = (bio_dgram_data *)a->ptr; |
| 244 | if(data != NULL) OPENSSL_free(data); | 246 | if (data != NULL) |
| 247 | OPENSSL_free(data); | ||
| 245 | 248 | ||
| 246 | return(1); | 249 | return (1); |
| 247 | } | 250 | } |
| 248 | 251 | ||
| 249 | static int dgram_clear(BIO *a) | 252 | static int |
| 250 | { | 253 | dgram_clear(BIO *a) |
| 251 | if (a == NULL) return(0); | 254 | { |
| 252 | if (a->shutdown) | 255 | if (a == NULL) |
| 253 | { | 256 | return (0); |
| 254 | if (a->init) | 257 | if (a->shutdown) { |
| 255 | { | 258 | if (a->init) { |
| 256 | shutdown(a->num, SHUT_RDWR); | 259 | shutdown(a->num, SHUT_RDWR); |
| 257 | close(a->num); | 260 | close(a->num); |
| 258 | } | ||
| 259 | a->init=0; | ||
| 260 | a->flags=0; | ||
| 261 | } | 261 | } |
| 262 | return(1); | 262 | a->init = 0; |
| 263 | a->flags = 0; | ||
| 263 | } | 264 | } |
| 265 | return (1); | ||
| 266 | } | ||
| 264 | 267 | ||
| 265 | static void dgram_adjust_rcv_timeout(BIO *b) | 268 | static void |
| 266 | { | 269 | dgram_adjust_rcv_timeout(BIO *b) |
| 270 | { | ||
| 267 | #if defined(SO_RCVTIMEO) | 271 | #if defined(SO_RCVTIMEO) |
| 268 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; | 272 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; |
| 269 | union { size_t s; int i; } sz = {0}; | 273 | union { size_t s; |
| 274 | int i; | ||
| 275 | } sz = {0}; | ||
| 270 | 276 | ||
| 271 | /* Is a timer active? */ | 277 | /* Is a timer active? */ |
| 272 | if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) | 278 | if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) { |
| 273 | { | ||
| 274 | struct timeval timenow, timeleft; | 279 | struct timeval timenow, timeleft; |
| 275 | 280 | ||
| 276 | /* Read current socket timeout */ | 281 | /* Read current socket timeout */ |
| @@ -279,20 +284,19 @@ static void dgram_adjust_rcv_timeout(BIO *b) | |||
| 279 | 284 | ||
| 280 | sz.i = sizeof(timeout); | 285 | sz.i = sizeof(timeout); |
| 281 | if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 286 | if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 282 | (void*)&timeout, &sz.i) < 0) | 287 | (void*)&timeout, &sz.i) < 0) { |
| 283 | { perror("getsockopt"); } | 288 | perror("getsockopt"); |
| 284 | else | 289 | } else { |
| 285 | { | ||
| 286 | data->socket_timeout.tv_sec = timeout / 1000; | 290 | data->socket_timeout.tv_sec = timeout / 1000; |
| 287 | data->socket_timeout.tv_usec = (timeout % 1000) * 1000; | 291 | data->socket_timeout.tv_usec = (timeout % 1000) * 1000; |
| 288 | } | 292 | } |
| 289 | #else | 293 | #else |
| 290 | sz.i = sizeof(data->socket_timeout); | 294 | sz.i = sizeof(data->socket_timeout); |
| 291 | if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 295 | if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 292 | &(data->socket_timeout), (void *)&sz) < 0) | 296 | &(data->socket_timeout), (void *)&sz) < 0) { |
| 293 | { perror("getsockopt"); } | 297 | perror("getsockopt"); |
| 294 | else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) | 298 | } else if (sizeof(sz.s) != sizeof(sz.i) && sz.i == 0) |
| 295 | OPENSSL_assert(sz.s<=sizeof(data->socket_timeout)); | 299 | OPENSSL_assert(sz.s <= sizeof(data->socket_timeout)); |
| 296 | #endif | 300 | #endif |
| 297 | 301 | ||
| 298 | /* Get current time */ | 302 | /* Get current time */ |
| @@ -302,126 +306,128 @@ static void dgram_adjust_rcv_timeout(BIO *b) | |||
| 302 | memcpy(&timeleft, &(data->next_timeout), sizeof(struct timeval)); | 306 | memcpy(&timeleft, &(data->next_timeout), sizeof(struct timeval)); |
| 303 | timeleft.tv_sec -= timenow.tv_sec; | 307 | timeleft.tv_sec -= timenow.tv_sec; |
| 304 | timeleft.tv_usec -= timenow.tv_usec; | 308 | timeleft.tv_usec -= timenow.tv_usec; |
| 305 | if (timeleft.tv_usec < 0) | 309 | if (timeleft.tv_usec < 0) { |
| 306 | { | ||
| 307 | timeleft.tv_sec--; | 310 | timeleft.tv_sec--; |
| 308 | timeleft.tv_usec += 1000000; | 311 | timeleft.tv_usec += 1000000; |
| 309 | } | 312 | } |
| 310 | 313 | ||
| 311 | if (timeleft.tv_sec < 0) | 314 | if (timeleft.tv_sec < 0) { |
| 312 | { | ||
| 313 | timeleft.tv_sec = 0; | 315 | timeleft.tv_sec = 0; |
| 314 | timeleft.tv_usec = 1; | 316 | timeleft.tv_usec = 1; |
| 315 | } | 317 | } |
| 316 | 318 | ||
| 317 | /* Adjust socket timeout if next handhake message timer | 319 | /* Adjust socket timeout if next handhake message timer |
| 318 | * will expire earlier. | 320 | * will expire earlier. |
| 319 | */ | 321 | */ |
| 320 | if ((data->socket_timeout.tv_sec == 0 && data->socket_timeout.tv_usec == 0) || | 322 | if ((data->socket_timeout.tv_sec == 0 && |
| 321 | (data->socket_timeout.tv_sec > timeleft.tv_sec) || | 323 | data->socket_timeout.tv_usec == 0) || |
| 322 | (data->socket_timeout.tv_sec == timeleft.tv_sec && | 324 | (data->socket_timeout.tv_sec > timeleft.tv_sec) || |
| 323 | data->socket_timeout.tv_usec >= timeleft.tv_usec)) | 325 | (data->socket_timeout.tv_sec == timeleft.tv_sec && |
| 324 | { | 326 | data->socket_timeout.tv_usec >= timeleft.tv_usec)) { |
| 325 | #ifdef OPENSSL_SYS_WINDOWS | 327 | #ifdef OPENSSL_SYS_WINDOWS |
| 326 | timeout = timeleft.tv_sec * 1000 + timeleft.tv_usec / 1000; | 328 | timeout = timeleft.tv_sec * 1000 + timeleft.tv_usec / 1000; |
| 327 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 329 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 328 | (void*)&timeout, sizeof(timeout)) < 0) | 330 | (void*)&timeout, sizeof(timeout)) < 0) { |
| 329 | { perror("setsockopt"); } | 331 | perror("setsockopt"); |
| 332 | } | ||
| 330 | #else | 333 | #else |
| 331 | if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &timeleft, | 334 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 332 | sizeof(struct timeval)) < 0) | 335 | &timeleft, sizeof(struct timeval)) < 0) { |
| 333 | { perror("setsockopt"); } | 336 | perror("setsockopt"); |
| 334 | #endif | ||
| 335 | } | 337 | } |
| 336 | } | ||
| 337 | #endif | 338 | #endif |
| 339 | } | ||
| 338 | } | 340 | } |
| 341 | #endif | ||
| 342 | } | ||
| 339 | 343 | ||
| 340 | static void dgram_reset_rcv_timeout(BIO *b) | 344 | static void |
| 341 | { | 345 | dgram_reset_rcv_timeout(BIO *b) |
| 346 | { | ||
| 342 | #if defined(SO_RCVTIMEO) | 347 | #if defined(SO_RCVTIMEO) |
| 343 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; | 348 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; |
| 344 | 349 | ||
| 345 | /* Is a timer active? */ | 350 | /* Is a timer active? */ |
| 346 | if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) | 351 | if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) { |
| 347 | { | ||
| 348 | #ifdef OPENSSL_SYS_WINDOWS | 352 | #ifdef OPENSSL_SYS_WINDOWS |
| 349 | int timeout = data->socket_timeout.tv_sec * 1000 + | 353 | int timeout = data->socket_timeout.tv_sec * 1000 + |
| 350 | data->socket_timeout.tv_usec / 1000; | 354 | data->socket_timeout.tv_usec / 1000; |
| 351 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 355 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 352 | (void*)&timeout, sizeof(timeout)) < 0) | 356 | (void*)&timeout, sizeof(timeout)) < 0) { |
| 353 | { perror("setsockopt"); } | 357 | perror("setsockopt"); |
| 358 | } | ||
| 354 | #else | 359 | #else |
| 355 | if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &(data->socket_timeout), | 360 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 356 | sizeof(struct timeval)) < 0) | 361 | &(data->socket_timeout), sizeof(struct timeval)) < 0) { |
| 357 | { perror("setsockopt"); } | 362 | perror("setsockopt"); |
| 358 | #endif | ||
| 359 | } | 363 | } |
| 360 | #endif | 364 | #endif |
| 361 | } | 365 | } |
| 366 | #endif | ||
| 367 | } | ||
| 362 | 368 | ||
| 363 | static int dgram_read(BIO *b, char *out, int outl) | 369 | static int |
| 364 | { | 370 | dgram_read(BIO *b, char *out, int outl) |
| 365 | int ret=0; | 371 | { |
| 372 | int ret = 0; | ||
| 366 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; | 373 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; |
| 367 | 374 | ||
| 368 | struct { | 375 | struct { |
| 369 | /* | 376 | /* |
| 370 | * See commentary in b_sock.c. <appro> | 377 | * See commentary in b_sock.c. <appro> |
| 371 | */ | 378 | */ |
| 372 | union { size_t s; int i; } len; | 379 | union { |
| 373 | union { | 380 | size_t s; |
| 374 | struct sockaddr sa; | 381 | int i; |
| 375 | struct sockaddr_in sa_in; | 382 | } len; |
| 383 | union { | ||
| 384 | struct sockaddr sa; | ||
| 385 | struct sockaddr_in sa_in; | ||
| 376 | #if OPENSSL_USE_IPV6 | 386 | #if OPENSSL_USE_IPV6 |
| 377 | struct sockaddr_in6 sa_in6; | 387 | struct sockaddr_in6 sa_in6; |
| 378 | #endif | 388 | #endif |
| 379 | } peer; | 389 | } peer; |
| 380 | } sa; | 390 | } sa; |
| 381 | 391 | ||
| 382 | sa.len.s=0; | 392 | sa.len.s = 0; |
| 383 | sa.len.i=sizeof(sa.peer); | 393 | sa.len.i = sizeof(sa.peer); |
| 384 | 394 | ||
| 385 | if (out != NULL) | 395 | if (out != NULL) { |
| 386 | { | ||
| 387 | errno = 0; | 396 | errno = 0; |
| 388 | memset(&sa.peer, 0x00, sizeof(sa.peer)); | 397 | memset(&sa.peer, 0x00, sizeof(sa.peer)); |
| 389 | dgram_adjust_rcv_timeout(b); | 398 | dgram_adjust_rcv_timeout(b); |
| 390 | ret=recvfrom(b->num,out,outl,0,&sa.peer.sa,(void *)&sa.len); | 399 | ret = recvfrom(b->num, out, outl, 0, &sa.peer.sa,(void *)&sa.len); |
| 391 | if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0) | 400 | if (sizeof(sa.len.i) != sizeof(sa.len.s) && sa.len.i == 0) { |
| 392 | { | 401 | OPENSSL_assert(sa.len.s <= sizeof(sa.peer)); |
| 393 | OPENSSL_assert(sa.len.s<=sizeof(sa.peer)); | ||
| 394 | sa.len.i = (int)sa.len.s; | 402 | sa.len.i = (int)sa.len.s; |
| 395 | } | 403 | } |
| 396 | 404 | ||
| 397 | if ( ! data->connected && ret >= 0) | 405 | if (! data->connected && ret >= 0) |
| 398 | BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &sa.peer); | 406 | BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &sa.peer); |
| 399 | 407 | ||
| 400 | BIO_clear_retry_flags(b); | 408 | BIO_clear_retry_flags(b); |
| 401 | if (ret < 0) | 409 | if (ret < 0) { |
| 402 | { | 410 | if (BIO_dgram_should_retry(ret)) { |
| 403 | if (BIO_dgram_should_retry(ret)) | ||
| 404 | { | ||
| 405 | BIO_set_retry_read(b); | 411 | BIO_set_retry_read(b); |
| 406 | data->_errno = errno; | 412 | data->_errno = errno; |
| 407 | } | ||
| 408 | } | 413 | } |
| 414 | } | ||
| 409 | 415 | ||
| 410 | dgram_reset_rcv_timeout(b); | 416 | dgram_reset_rcv_timeout(b); |
| 411 | } | ||
| 412 | return(ret); | ||
| 413 | } | 417 | } |
| 418 | return (ret); | ||
| 419 | } | ||
| 414 | 420 | ||
| 415 | static int dgram_write(BIO *b, const char *in, int inl) | 421 | static int |
| 416 | { | 422 | dgram_write(BIO *b, const char *in, int inl) |
| 423 | { | ||
| 417 | int ret; | 424 | int ret; |
| 418 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; | 425 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; |
| 419 | errno = 0; | 426 | errno = 0; |
| 420 | 427 | ||
| 421 | if ( data->connected ) | 428 | if (data->connected) |
| 422 | ret=write(b->num,in,inl); | 429 | ret = write(b->num, in, inl); |
| 423 | else | 430 | else { |
| 424 | { | ||
| 425 | int peerlen = sizeof(data->peer); | 431 | int peerlen = sizeof(data->peer); |
| 426 | 432 | ||
| 427 | if (data->peer.sa.sa_family == AF_INET) | 433 | if (data->peer.sa.sa_family == AF_INET) |
| @@ -431,33 +437,33 @@ static int dgram_write(BIO *b, const char *in, int inl) | |||
| 431 | peerlen = sizeof(data->peer.sa_in6); | 437 | peerlen = sizeof(data->peer.sa_in6); |
| 432 | #endif | 438 | #endif |
| 433 | #if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK) | 439 | #if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK) |
| 434 | ret=sendto(b->num, (char *)in, inl, 0, &data->peer.sa, peerlen); | 440 | ret = sendto(b->num, (char *)in, inl, 0, &data->peer.sa, peerlen); |
| 435 | #else | 441 | #else |
| 436 | ret=sendto(b->num, in, inl, 0, &data->peer.sa, peerlen); | 442 | ret = sendto(b->num, in, inl, 0, &data->peer.sa, peerlen); |
| 437 | #endif | 443 | #endif |
| 438 | } | 444 | } |
| 439 | 445 | ||
| 440 | BIO_clear_retry_flags(b); | 446 | BIO_clear_retry_flags(b); |
| 441 | if (ret <= 0) | 447 | if (ret <= 0) { |
| 442 | { | 448 | if (BIO_dgram_should_retry(ret)) { |
| 443 | if (BIO_dgram_should_retry(ret)) | 449 | BIO_set_retry_write(b); |
| 444 | { | 450 | |
| 445 | BIO_set_retry_write(b); | ||
| 446 | data->_errno = errno; | 451 | data->_errno = errno; |
| 447 | 452 | ||
| 448 | #if 0 /* higher layers are responsible for querying MTU, if necessary */ | 453 | #if 0 /* higher layers are responsible for querying MTU, if necessary */ |
| 449 | if ( data->_errno == EMSGSIZE) | 454 | if (data->_errno == EMSGSIZE) |
| 450 | /* retrieve the new MTU */ | 455 | /* retrieve the new MTU */ |
| 451 | BIO_ctrl(b, BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL); | 456 | BIO_ctrl(b, BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL); |
| 452 | #endif | 457 | #endif |
| 453 | } | ||
| 454 | } | 458 | } |
| 455 | return(ret); | ||
| 456 | } | 459 | } |
| 460 | return (ret); | ||
| 461 | } | ||
| 457 | 462 | ||
| 458 | static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | 463 | static long |
| 459 | { | 464 | dgram_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 460 | long ret=1; | 465 | { |
| 466 | long ret = 1; | ||
| 461 | int *ip; | 467 | int *ip; |
| 462 | struct sockaddr *to = NULL; | 468 | struct sockaddr *to = NULL; |
| 463 | bio_dgram_data *data = NULL; | 469 | bio_dgram_data *data = NULL; |
| @@ -472,76 +478,73 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 472 | #if OPENSSL_USE_IPV6 | 478 | #if OPENSSL_USE_IPV6 |
| 473 | struct sockaddr_in6 s6; | 479 | struct sockaddr_in6 s6; |
| 474 | #endif | 480 | #endif |
| 475 | } addr; | 481 | } addr; |
| 476 | #endif | 482 | #endif |
| 477 | 483 | ||
| 478 | data = (bio_dgram_data *)b->ptr; | 484 | data = (bio_dgram_data *)b->ptr; |
| 479 | 485 | ||
| 480 | switch (cmd) | 486 | switch (cmd) { |
| 481 | { | ||
| 482 | case BIO_CTRL_RESET: | 487 | case BIO_CTRL_RESET: |
| 483 | num=0; | 488 | num = 0; |
| 484 | case BIO_C_FILE_SEEK: | 489 | case BIO_C_FILE_SEEK: |
| 485 | ret=0; | 490 | ret = 0; |
| 486 | break; | 491 | break; |
| 487 | case BIO_C_FILE_TELL: | 492 | case BIO_C_FILE_TELL: |
| 488 | case BIO_CTRL_INFO: | 493 | case BIO_CTRL_INFO: |
| 489 | ret=0; | 494 | ret = 0; |
| 490 | break; | 495 | break; |
| 491 | case BIO_C_SET_FD: | 496 | case BIO_C_SET_FD: |
| 492 | dgram_clear(b); | 497 | dgram_clear(b); |
| 493 | b->num= *((int *)ptr); | 498 | b->num= *((int *)ptr); |
| 494 | b->shutdown=(int)num; | 499 | b->shutdown = (int)num; |
| 495 | b->init=1; | 500 | b->init = 1; |
| 496 | break; | 501 | break; |
| 497 | case BIO_C_GET_FD: | 502 | case BIO_C_GET_FD: |
| 498 | if (b->init) | 503 | if (b->init) { |
| 499 | { | 504 | ip = (int *)ptr; |
| 500 | ip=(int *)ptr; | 505 | if (ip != NULL) |
| 501 | if (ip != NULL) *ip=b->num; | 506 | *ip = b->num; |
| 502 | ret=b->num; | 507 | ret = b->num; |
| 503 | } | 508 | } else |
| 504 | else | 509 | ret = -1; |
| 505 | ret= -1; | ||
| 506 | break; | 510 | break; |
| 507 | case BIO_CTRL_GET_CLOSE: | 511 | case BIO_CTRL_GET_CLOSE: |
| 508 | ret=b->shutdown; | 512 | ret = b->shutdown; |
| 509 | break; | 513 | break; |
| 510 | case BIO_CTRL_SET_CLOSE: | 514 | case BIO_CTRL_SET_CLOSE: |
| 511 | b->shutdown=(int)num; | 515 | b->shutdown = (int)num; |
| 512 | break; | 516 | break; |
| 513 | case BIO_CTRL_PENDING: | 517 | case BIO_CTRL_PENDING: |
| 514 | case BIO_CTRL_WPENDING: | 518 | case BIO_CTRL_WPENDING: |
| 515 | ret=0; | 519 | ret = 0; |
| 516 | break; | 520 | break; |
| 517 | case BIO_CTRL_DUP: | 521 | case BIO_CTRL_DUP: |
| 518 | case BIO_CTRL_FLUSH: | 522 | case BIO_CTRL_FLUSH: |
| 519 | ret=1; | 523 | ret = 1; |
| 520 | break; | 524 | break; |
| 521 | case BIO_CTRL_DGRAM_CONNECT: | 525 | case BIO_CTRL_DGRAM_CONNECT: |
| 522 | to = (struct sockaddr *)ptr; | 526 | to = (struct sockaddr *)ptr; |
| 523 | #if 0 | 527 | #if 0 |
| 524 | if (connect(b->num, to, sizeof(struct sockaddr)) < 0) | 528 | if (connect(b->num, to, sizeof(struct sockaddr)) < 0) { |
| 525 | { perror("connect"); ret = 0; } | 529 | perror("connect"); |
| 526 | else | 530 | ret = 0; |
| 527 | { | 531 | } else { |
| 528 | #endif | 532 | #endif |
| 529 | switch (to->sa_family) | 533 | switch (to->sa_family) { |
| 530 | { | 534 | case AF_INET: |
| 531 | case AF_INET: | 535 | memcpy(&data->peer, to, sizeof(data->peer.sa_in)); |
| 532 | memcpy(&data->peer,to,sizeof(data->peer.sa_in)); | 536 | break; |
| 533 | break; | ||
| 534 | #if OPENSSL_USE_IPV6 | 537 | #if OPENSSL_USE_IPV6 |
| 535 | case AF_INET6: | 538 | case AF_INET6: |
| 536 | memcpy(&data->peer,to,sizeof(data->peer.sa_in6)); | 539 | memcpy(&data->peer, to, sizeof(data->peer.sa_in6)); |
| 537 | break; | 540 | break; |
| 538 | #endif | 541 | #endif |
| 539 | default: | 542 | default: |
| 540 | memcpy(&data->peer,to,sizeof(data->peer.sa)); | 543 | memcpy(&data->peer, to, sizeof(data->peer.sa)); |
| 541 | break; | 544 | break; |
| 542 | } | ||
| 543 | #if 0 | ||
| 544 | } | 545 | } |
| 546 | #if 0 | ||
| 547 | } | ||
| 545 | #endif | 548 | #endif |
| 546 | break; | 549 | break; |
| 547 | /* (Linux)kernel sets DF bit on outgoing IP packets */ | 550 | /* (Linux)kernel sets DF bit on outgoing IP packets */ |
| @@ -549,31 +552,31 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 549 | #if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO) | 552 | #if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO) |
| 550 | addr_len = (socklen_t)sizeof(addr); | 553 | addr_len = (socklen_t)sizeof(addr); |
| 551 | memset((void *)&addr, 0, sizeof(addr)); | 554 | memset((void *)&addr, 0, sizeof(addr)); |
| 552 | if (getsockname(b->num, &addr.sa, &addr_len) < 0) | 555 | if (getsockname(b->num, &addr.sa, &addr_len) < 0) { |
| 553 | { | ||
| 554 | ret = 0; | 556 | ret = 0; |
| 555 | break; | 557 | break; |
| 556 | } | 558 | } |
| 557 | switch (addr.sa.sa_family) | 559 | switch (addr.sa.sa_family) { |
| 558 | { | ||
| 559 | case AF_INET: | 560 | case AF_INET: |
| 560 | sockopt_val = IP_PMTUDISC_DO; | 561 | sockopt_val = IP_PMTUDISC_DO; |
| 561 | if ((ret = setsockopt(b->num, IPPROTO_IP, IP_MTU_DISCOVER, | 562 | if ((ret = setsockopt(b->num, IPPROTO_IP, |
| 562 | &sockopt_val, sizeof(sockopt_val))) < 0) | 563 | IP_MTU_DISCOVER, &sockopt_val, |
| 564 | sizeof(sockopt_val))) < 0) | ||
| 563 | perror("setsockopt"); | 565 | perror("setsockopt"); |
| 564 | break; | 566 | break; |
| 565 | #if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO) | 567 | #if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO) |
| 566 | case AF_INET6: | 568 | case AF_INET6: |
| 567 | sockopt_val = IPV6_PMTUDISC_DO; | 569 | sockopt_val = IPV6_PMTUDISC_DO; |
| 568 | if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER, | 570 | if ((ret = setsockopt(b->num, IPPROTO_IPV6, |
| 569 | &sockopt_val, sizeof(sockopt_val))) < 0) | 571 | IPV6_MTU_DISCOVER, &sockopt_val, |
| 572 | sizeof(sockopt_val))) < 0) | ||
| 570 | perror("setsockopt"); | 573 | perror("setsockopt"); |
| 571 | break; | 574 | break; |
| 572 | #endif | 575 | #endif |
| 573 | default: | 576 | default: |
| 574 | ret = -1; | 577 | ret = -1; |
| 575 | break; | 578 | break; |
| 576 | } | 579 | } |
| 577 | ret = -1; | 580 | ret = -1; |
| 578 | #else | 581 | #else |
| 579 | break; | 582 | break; |
| @@ -582,74 +585,67 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 582 | #if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU) | 585 | #if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU) |
| 583 | addr_len = (socklen_t)sizeof(addr); | 586 | addr_len = (socklen_t)sizeof(addr); |
| 584 | memset((void *)&addr, 0, sizeof(addr)); | 587 | memset((void *)&addr, 0, sizeof(addr)); |
| 585 | if (getsockname(b->num, &addr.sa, &addr_len) < 0) | 588 | if (getsockname(b->num, &addr.sa, &addr_len) < 0) { |
| 586 | { | ||
| 587 | ret = 0; | 589 | ret = 0; |
| 588 | break; | 590 | break; |
| 589 | } | 591 | } |
| 590 | sockopt_len = sizeof(sockopt_val); | 592 | sockopt_len = sizeof(sockopt_val); |
| 591 | switch (addr.sa.sa_family) | 593 | switch (addr.sa.sa_family) { |
| 592 | { | ||
| 593 | case AF_INET: | 594 | case AF_INET: |
| 594 | if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, (void *)&sockopt_val, | 595 | if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, |
| 595 | &sockopt_len)) < 0 || sockopt_val < 0) | 596 | (void *)&sockopt_val, &sockopt_len)) < 0 || |
| 596 | { | 597 | sockopt_val < 0) { |
| 597 | ret = 0; | 598 | ret = 0; |
| 598 | } | 599 | } else { |
| 599 | else | ||
| 600 | { | ||
| 601 | /* we assume that the transport protocol is UDP and no | 600 | /* we assume that the transport protocol is UDP and no |
| 602 | * IP options are used. | 601 | * IP options are used. |
| 603 | */ | 602 | */ |
| 604 | data->mtu = sockopt_val - 8 - 20; | 603 | data->mtu = sockopt_val - 8 - 20; |
| 605 | ret = data->mtu; | 604 | ret = data->mtu; |
| 606 | } | 605 | } |
| 607 | break; | 606 | break; |
| 608 | #if OPENSSL_USE_IPV6 && defined(IPV6_MTU) | 607 | #if OPENSSL_USE_IPV6 && defined(IPV6_MTU) |
| 609 | case AF_INET6: | 608 | case AF_INET6: |
| 610 | if ((ret = getsockopt(b->num, IPPROTO_IPV6, IPV6_MTU, (void *)&sockopt_val, | 609 | if ((ret = getsockopt(b->num, IPPROTO_IPV6, IPV6_MTU, |
| 611 | &sockopt_len)) < 0 || sockopt_val < 0) | 610 | (void *)&sockopt_val, &sockopt_len)) < 0 || |
| 612 | { | 611 | sockopt_val < 0) { |
| 613 | ret = 0; | 612 | ret = 0; |
| 614 | } | 613 | } else { |
| 615 | else | ||
| 616 | { | ||
| 617 | /* we assume that the transport protocol is UDP and no | 614 | /* we assume that the transport protocol is UDP and no |
| 618 | * IPV6 options are used. | 615 | * IPV6 options are used. |
| 619 | */ | 616 | */ |
| 620 | data->mtu = sockopt_val - 8 - 40; | 617 | data->mtu = sockopt_val - 8 - 40; |
| 621 | ret = data->mtu; | 618 | ret = data->mtu; |
| 622 | } | 619 | } |
| 623 | break; | 620 | break; |
| 624 | #endif | 621 | #endif |
| 625 | default: | 622 | default: |
| 626 | ret = 0; | 623 | ret = 0; |
| 627 | break; | 624 | break; |
| 628 | } | 625 | } |
| 629 | #else | 626 | #else |
| 630 | ret = 0; | 627 | ret = 0; |
| 631 | #endif | 628 | #endif |
| 632 | break; | 629 | break; |
| 633 | case BIO_CTRL_DGRAM_GET_FALLBACK_MTU: | 630 | case BIO_CTRL_DGRAM_GET_FALLBACK_MTU: |
| 634 | switch (data->peer.sa.sa_family) | 631 | switch (data->peer.sa.sa_family) { |
| 635 | { | 632 | case AF_INET: |
| 636 | case AF_INET: | 633 | ret = 576 - 20 - 8; |
| 637 | ret = 576 - 20 - 8; | 634 | break; |
| 638 | break; | ||
| 639 | #if OPENSSL_USE_IPV6 | 635 | #if OPENSSL_USE_IPV6 |
| 640 | case AF_INET6: | 636 | case AF_INET6: |
| 641 | #ifdef IN6_IS_ADDR_V4MAPPED | 637 | #ifdef IN6_IS_ADDR_V4MAPPED |
| 642 | if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6_addr)) | 638 | if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6_addr)) |
| 643 | ret = 576 - 20 - 8; | 639 | ret = 576 - 20 - 8; |
| 644 | else | 640 | else |
| 645 | #endif | 641 | #endif |
| 646 | ret = 1280 - 40 - 8; | 642 | ret = 1280 - 40 - 8; |
| 647 | break; | 643 | break; |
| 648 | #endif | 644 | #endif |
| 649 | default: | 645 | default: |
| 650 | ret = 576 - 20 - 8; | 646 | ret = 576 - 20 - 8; |
| 651 | break; | 647 | break; |
| 652 | } | 648 | } |
| 653 | break; | 649 | break; |
| 654 | case BIO_CTRL_DGRAM_GET_MTU: | 650 | case BIO_CTRL_DGRAM_GET_MTU: |
| 655 | return data->mtu; | 651 | return data->mtu; |
| @@ -661,65 +657,59 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 661 | case BIO_CTRL_DGRAM_SET_CONNECTED: | 657 | case BIO_CTRL_DGRAM_SET_CONNECTED: |
| 662 | to = (struct sockaddr *)ptr; | 658 | to = (struct sockaddr *)ptr; |
| 663 | 659 | ||
| 664 | if ( to != NULL) | 660 | if (to != NULL) { |
| 665 | { | ||
| 666 | data->connected = 1; | 661 | data->connected = 1; |
| 667 | switch (to->sa_family) | 662 | switch (to->sa_family) { |
| 668 | { | ||
| 669 | case AF_INET: | ||
| 670 | memcpy(&data->peer,to,sizeof(data->peer.sa_in)); | ||
| 671 | break; | ||
| 672 | #if OPENSSL_USE_IPV6 | ||
| 673 | case AF_INET6: | ||
| 674 | memcpy(&data->peer,to,sizeof(data->peer.sa_in6)); | ||
| 675 | break; | ||
| 676 | #endif | ||
| 677 | default: | ||
| 678 | memcpy(&data->peer,to,sizeof(data->peer.sa)); | ||
| 679 | break; | ||
| 680 | } | ||
| 681 | } | ||
| 682 | else | ||
| 683 | { | ||
| 684 | data->connected = 0; | ||
| 685 | memset(&(data->peer), 0x00, sizeof(data->peer)); | ||
| 686 | } | ||
| 687 | break; | ||
| 688 | case BIO_CTRL_DGRAM_GET_PEER: | ||
| 689 | switch (data->peer.sa.sa_family) | ||
| 690 | { | ||
| 691 | case AF_INET: | 663 | case AF_INET: |
| 692 | ret=sizeof(data->peer.sa_in); | 664 | memcpy(&data->peer, to, sizeof(data->peer.sa_in)); |
| 693 | break; | 665 | break; |
| 694 | #if OPENSSL_USE_IPV6 | 666 | #if OPENSSL_USE_IPV6 |
| 695 | case AF_INET6: | 667 | case AF_INET6: |
| 696 | ret=sizeof(data->peer.sa_in6); | 668 | memcpy(&data->peer, to, sizeof(data->peer.sa_in6)); |
| 697 | break; | 669 | break; |
| 698 | #endif | 670 | #endif |
| 699 | default: | 671 | default: |
| 700 | ret=sizeof(data->peer.sa); | 672 | memcpy(&data->peer, to, sizeof(data->peer.sa)); |
| 701 | break; | 673 | break; |
| 702 | } | 674 | } |
| 703 | if (num==0 || num>ret) | 675 | } else { |
| 704 | num=ret; | 676 | data->connected = 0; |
| 705 | memcpy(ptr,&data->peer,(ret=num)); | 677 | memset(&(data->peer), 0x00, sizeof(data->peer)); |
| 678 | } | ||
| 679 | break; | ||
| 680 | case BIO_CTRL_DGRAM_GET_PEER: | ||
| 681 | switch (data->peer.sa.sa_family) { | ||
| 682 | case AF_INET: | ||
| 683 | ret = sizeof(data->peer.sa_in); | ||
| 684 | break; | ||
| 685 | #if OPENSSL_USE_IPV6 | ||
| 686 | case AF_INET6: | ||
| 687 | ret = sizeof(data->peer.sa_in6); | ||
| 688 | break; | ||
| 689 | #endif | ||
| 690 | default: | ||
| 691 | ret = sizeof(data->peer.sa); | ||
| 692 | break; | ||
| 693 | } | ||
| 694 | if (num == 0 || num > ret) | ||
| 695 | num = ret; | ||
| 696 | memcpy(ptr, &data->peer, (ret = num)); | ||
| 706 | break; | 697 | break; |
| 707 | case BIO_CTRL_DGRAM_SET_PEER: | 698 | case BIO_CTRL_DGRAM_SET_PEER: |
| 708 | to = (struct sockaddr *) ptr; | 699 | to = (struct sockaddr *) ptr; |
| 709 | switch (to->sa_family) | 700 | switch (to->sa_family) { |
| 710 | { | 701 | case AF_INET: |
| 711 | case AF_INET: | 702 | memcpy(&data->peer, to, sizeof(data->peer.sa_in)); |
| 712 | memcpy(&data->peer,to,sizeof(data->peer.sa_in)); | 703 | break; |
| 713 | break; | ||
| 714 | #if OPENSSL_USE_IPV6 | 704 | #if OPENSSL_USE_IPV6 |
| 715 | case AF_INET6: | 705 | case AF_INET6: |
| 716 | memcpy(&data->peer,to,sizeof(data->peer.sa_in6)); | 706 | memcpy(&data->peer, to, sizeof(data->peer.sa_in6)); |
| 717 | break; | 707 | break; |
| 718 | #endif | 708 | #endif |
| 719 | default: | 709 | default: |
| 720 | memcpy(&data->peer,to,sizeof(data->peer.sa)); | 710 | memcpy(&data->peer, to, sizeof(data->peer.sa)); |
| 721 | break; | 711 | break; |
| 722 | } | 712 | } |
| 723 | break; | 713 | break; |
| 724 | case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT: | 714 | case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT: |
| 725 | memcpy(&(data->next_timeout), ptr, sizeof(struct timeval)); | 715 | memcpy(&(data->next_timeout), ptr, sizeof(struct timeval)); |
| @@ -728,47 +718,53 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 728 | case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT: | 718 | case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT: |
| 729 | #ifdef OPENSSL_SYS_WINDOWS | 719 | #ifdef OPENSSL_SYS_WINDOWS |
| 730 | { | 720 | { |
| 731 | struct timeval *tv = (struct timeval *)ptr; | 721 | struct timeval *tv = (struct timeval *)ptr; |
| 732 | int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; | 722 | int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; |
| 733 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 723 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 734 | (void*)&timeout, sizeof(timeout)) < 0) | 724 | (void*)&timeout, sizeof(timeout)) < 0) { |
| 735 | { perror("setsockopt"); ret = -1; } | 725 | perror("setsockopt"); |
| 726 | ret = -1; | ||
| 727 | } | ||
| 736 | } | 728 | } |
| 737 | #else | 729 | #else |
| 738 | if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr, | 730 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr, |
| 739 | sizeof(struct timeval)) < 0) | 731 | sizeof(struct timeval)) < 0) { |
| 740 | { perror("setsockopt"); ret = -1; } | 732 | perror("setsockopt"); |
| 733 | ret = -1; | ||
| 734 | } | ||
| 741 | #endif | 735 | #endif |
| 742 | break; | 736 | break; |
| 743 | case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT: | 737 | case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT: |
| 744 | { | 738 | { |
| 745 | union { size_t s; int i; } sz = {0}; | 739 | union { |
| 740 | size_t s; | ||
| 741 | int i; | ||
| 742 | } sz = {0}; | ||
| 746 | #ifdef OPENSSL_SYS_WINDOWS | 743 | #ifdef OPENSSL_SYS_WINDOWS |
| 747 | int timeout; | 744 | int timeout; |
| 748 | struct timeval *tv = (struct timeval *)ptr; | 745 | struct timeval *tv = (struct timeval *)ptr; |
| 749 | 746 | ||
| 750 | sz.i = sizeof(timeout); | 747 | sz.i = sizeof(timeout); |
| 751 | if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 748 | if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 752 | (void*)&timeout, &sz.i) < 0) | 749 | (void*)&timeout, &sz.i) < 0) { |
| 753 | { perror("getsockopt"); ret = -1; } | 750 | perror("getsockopt"); |
| 754 | else | 751 | ret = -1; |
| 755 | { | 752 | } else { |
| 756 | tv->tv_sec = timeout / 1000; | 753 | tv->tv_sec = timeout / 1000; |
| 757 | tv->tv_usec = (timeout % 1000) * 1000; | 754 | tv->tv_usec = (timeout % 1000) * 1000; |
| 758 | ret = sizeof(*tv); | 755 | ret = sizeof(*tv); |
| 759 | } | 756 | } |
| 760 | #else | 757 | #else |
| 761 | sz.i = sizeof(struct timeval); | 758 | sz.i = sizeof(struct timeval); |
| 762 | if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 759 | if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 763 | ptr, (void *)&sz) < 0) | 760 | ptr, (void *)&sz) < 0) { |
| 764 | { perror("getsockopt"); ret = -1; } | 761 | perror("getsockopt"); |
| 765 | else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) | 762 | ret = -1; |
| 766 | { | 763 | } else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) { |
| 767 | OPENSSL_assert(sz.s<=sizeof(struct timeval)); | 764 | OPENSSL_assert(sz.s <= sizeof(struct timeval)); |
| 768 | ret = (int)sz.s; | 765 | ret = (int)sz.s; |
| 769 | } | 766 | } else |
| 770 | else | 767 | ret = sz.i; |
| 771 | ret = sz.i; | ||
| 772 | #endif | 768 | #endif |
| 773 | } | 769 | } |
| 774 | break; | 770 | break; |
| @@ -777,47 +773,53 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 777 | case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT: | 773 | case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT: |
| 778 | #ifdef OPENSSL_SYS_WINDOWS | 774 | #ifdef OPENSSL_SYS_WINDOWS |
| 779 | { | 775 | { |
| 780 | struct timeval *tv = (struct timeval *)ptr; | 776 | struct timeval *tv = (struct timeval *)ptr; |
| 781 | int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; | 777 | int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; |
| 782 | if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, | 778 | if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, |
| 783 | (void*)&timeout, sizeof(timeout)) < 0) | 779 | (void*)&timeout, sizeof(timeout)) < 0) { |
| 784 | { perror("setsockopt"); ret = -1; } | 780 | perror("setsockopt"); |
| 781 | ret = -1; | ||
| 782 | } | ||
| 785 | } | 783 | } |
| 786 | #else | 784 | #else |
| 787 | if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr, | 785 | if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr, |
| 788 | sizeof(struct timeval)) < 0) | 786 | sizeof(struct timeval)) < 0) { |
| 789 | { perror("setsockopt"); ret = -1; } | 787 | perror("setsockopt"); |
| 788 | ret = -1; | ||
| 789 | } | ||
| 790 | #endif | 790 | #endif |
| 791 | break; | 791 | break; |
| 792 | case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT: | 792 | case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT: |
| 793 | { | 793 | { |
| 794 | union { size_t s; int i; } sz = {0}; | 794 | union { |
| 795 | size_t s; | ||
| 796 | int i; | ||
| 797 | } sz = {0}; | ||
| 795 | #ifdef OPENSSL_SYS_WINDOWS | 798 | #ifdef OPENSSL_SYS_WINDOWS |
| 796 | int timeout; | 799 | int timeout; |
| 797 | struct timeval *tv = (struct timeval *)ptr; | 800 | struct timeval *tv = (struct timeval *)ptr; |
| 798 | 801 | ||
| 799 | sz.i = sizeof(timeout); | 802 | sz.i = sizeof(timeout); |
| 800 | if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, | 803 | if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, |
| 801 | (void*)&timeout, &sz.i) < 0) | 804 | (void*)&timeout, &sz.i) < 0) { |
| 802 | { perror("getsockopt"); ret = -1; } | 805 | perror("getsockopt"); |
| 803 | else | 806 | ret = -1; |
| 804 | { | 807 | } else { |
| 805 | tv->tv_sec = timeout / 1000; | 808 | tv->tv_sec = timeout / 1000; |
| 806 | tv->tv_usec = (timeout % 1000) * 1000; | 809 | tv->tv_usec = (timeout % 1000) * 1000; |
| 807 | ret = sizeof(*tv); | 810 | ret = sizeof(*tv); |
| 808 | } | 811 | } |
| 809 | #else | 812 | #else |
| 810 | sz.i = sizeof(struct timeval); | 813 | sz.i = sizeof(struct timeval); |
| 811 | if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, | 814 | if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, |
| 812 | ptr, (void *)&sz) < 0) | 815 | ptr, (void *)&sz) < 0) { |
| 813 | { perror("getsockopt"); ret = -1; } | 816 | perror("getsockopt"); |
| 814 | else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) | 817 | ret = -1; |
| 815 | { | 818 | } else if (sizeof(sz.s) != sizeof(sz.i) && sz.i == 0) { |
| 816 | OPENSSL_assert(sz.s<=sizeof(struct timeval)); | 819 | OPENSSL_assert(sz.s <= sizeof(struct timeval)); |
| 817 | ret = (int)sz.s; | 820 | ret = (int)sz.s; |
| 818 | } | 821 | } else |
| 819 | else | 822 | ret = sz.i; |
| 820 | ret = sz.i; | ||
| 821 | #endif | 823 | #endif |
| 822 | } | 824 | } |
| 823 | break; | 825 | break; |
| @@ -826,52 +828,52 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 826 | /* fall-through */ | 828 | /* fall-through */ |
| 827 | case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP: | 829 | case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP: |
| 828 | #ifdef OPENSSL_SYS_WINDOWS | 830 | #ifdef OPENSSL_SYS_WINDOWS |
| 829 | if ( data->_errno == WSAETIMEDOUT) | 831 | if (data->_errno == WSAETIMEDOUT) |
| 830 | #else | 832 | #else |
| 831 | if ( data->_errno == EAGAIN) | 833 | if (data->_errno == EAGAIN) |
| 832 | #endif | 834 | #endif |
| 833 | { | 835 | { |
| 834 | ret = 1; | 836 | ret = 1; |
| 835 | data->_errno = 0; | 837 | data->_errno = 0; |
| 836 | } | 838 | } else |
| 837 | else | ||
| 838 | ret = 0; | 839 | ret = 0; |
| 839 | break; | 840 | break; |
| 840 | #ifdef EMSGSIZE | 841 | #ifdef EMSGSIZE |
| 841 | case BIO_CTRL_DGRAM_MTU_EXCEEDED: | 842 | case BIO_CTRL_DGRAM_MTU_EXCEEDED: |
| 842 | if ( data->_errno == EMSGSIZE) | 843 | if (data->_errno == EMSGSIZE) { |
| 843 | { | ||
| 844 | ret = 1; | 844 | ret = 1; |
| 845 | data->_errno = 0; | 845 | data->_errno = 0; |
| 846 | } | 846 | } else |
| 847 | else | ||
| 848 | ret = 0; | 847 | ret = 0; |
| 849 | break; | 848 | break; |
| 850 | #endif | 849 | #endif |
| 851 | default: | 850 | default: |
| 852 | ret=0; | 851 | ret = 0; |
| 853 | break; | 852 | break; |
| 854 | } | ||
| 855 | return(ret); | ||
| 856 | } | 853 | } |
| 854 | return (ret); | ||
| 855 | } | ||
| 857 | 856 | ||
| 858 | static int dgram_puts(BIO *bp, const char *str) | 857 | static int |
| 859 | { | 858 | dgram_puts(BIO *bp, const char *str) |
| 860 | int n,ret; | 859 | { |
| 860 | int n, ret; | ||
| 861 | 861 | ||
| 862 | n=strlen(str); | 862 | n = strlen(str); |
| 863 | ret=dgram_write(bp,str,n); | 863 | ret = dgram_write(bp, str, n); |
| 864 | return(ret); | 864 | return (ret); |
| 865 | } | 865 | } |
| 866 | 866 | ||
| 867 | #ifndef OPENSSL_NO_SCTP | 867 | #ifndef OPENSSL_NO_SCTP |
| 868 | BIO_METHOD *BIO_s_datagram_sctp(void) | 868 | BIO_METHOD |
| 869 | { | 869 | *BIO_s_datagram_sctp(void) |
| 870 | return(&methods_dgramp_sctp); | 870 | { |
| 871 | } | 871 | return (&methods_dgramp_sctp); |
| 872 | } | ||
| 872 | 873 | ||
| 873 | BIO *BIO_new_dgram_sctp(int fd, int close_flag) | 874 | BIO |
| 874 | { | 875 | *BIO_new_dgram_sctp(int fd, int close_flag) |
| 876 | { | ||
| 875 | BIO *bio; | 877 | BIO *bio; |
| 876 | int ret, optval = 20000; | 878 | int ret, optval = 20000; |
| 877 | int auth_data = 0, auth_forward = 0; | 879 | int auth_data = 0, auth_forward = 0; |
| @@ -887,9 +889,10 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag) | |||
| 887 | #endif | 889 | #endif |
| 888 | #endif | 890 | #endif |
| 889 | 891 | ||
| 890 | bio=BIO_new(BIO_s_datagram_sctp()); | 892 | bio = BIO_new(BIO_s_datagram_sctp()); |
| 891 | if (bio == NULL) return(NULL); | 893 | if (bio == NULL) |
| 892 | BIO_set_fd(bio,fd,close_flag); | 894 | return (NULL); |
| 895 | BIO_set_fd(bio, fd, close_flag); | ||
| 893 | 896 | ||
| 894 | /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */ | 897 | /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */ |
| 895 | auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE; | 898 | auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE; |
| @@ -909,13 +912,14 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag) | |||
| 909 | OPENSSL_assert(ret >= 0); | 912 | OPENSSL_assert(ret >= 0); |
| 910 | 913 | ||
| 911 | for (p = (unsigned char*) authchunks->gauth_chunks; | 914 | for (p = (unsigned char*) authchunks->gauth_chunks; |
| 912 | p < (unsigned char*) authchunks + sockopt_len; | 915 | p < (unsigned char*) authchunks + sockopt_len; |
| 913 | p += sizeof(uint8_t)) | 916 | p += sizeof(uint8_t)) { |
| 914 | { | 917 | if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) |
| 915 | if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) auth_data = 1; | 918 | auth_data = 1; |
| 916 | if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) auth_forward = 1; | 919 | if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) |
| 917 | } | 920 | auth_forward = 1; |
| 918 | 921 | } | |
| 922 | |||
| 919 | OPENSSL_free(authchunks); | 923 | OPENSSL_free(authchunks); |
| 920 | 924 | ||
| 921 | OPENSSL_assert(auth_data); | 925 | OPENSSL_assert(auth_data); |
| @@ -947,20 +951,22 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag) | |||
| 947 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval, sizeof(optval)); | 951 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval, sizeof(optval)); |
| 948 | OPENSSL_assert(ret >= 0); | 952 | OPENSSL_assert(ret >= 0); |
| 949 | 953 | ||
| 950 | return(bio); | 954 | return (bio); |
| 951 | } | 955 | } |
| 952 | 956 | ||
| 953 | int BIO_dgram_is_sctp(BIO *bio) | 957 | int |
| 954 | { | 958 | BIO_dgram_is_sctp(BIO *bio) |
| 959 | { | ||
| 955 | return (BIO_method_type(bio) == BIO_TYPE_DGRAM_SCTP); | 960 | return (BIO_method_type(bio) == BIO_TYPE_DGRAM_SCTP); |
| 956 | } | 961 | } |
| 957 | 962 | ||
| 958 | static int dgram_sctp_new(BIO *bi) | 963 | static int |
| 959 | { | 964 | dgram_sctp_new(BIO *bi) |
| 965 | { | ||
| 960 | bio_dgram_sctp_data *data = NULL; | 966 | bio_dgram_sctp_data *data = NULL; |
| 961 | 967 | ||
| 962 | bi->init=0; | 968 | bi->init = 0; |
| 963 | bi->num=0; | 969 | bi->num = 0; |
| 964 | data = OPENSSL_malloc(sizeof(bio_dgram_sctp_data)); | 970 | data = OPENSSL_malloc(sizeof(bio_dgram_sctp_data)); |
| 965 | if (data == NULL) | 971 | if (data == NULL) |
| 966 | return 0; | 972 | return 0; |
| @@ -968,46 +974,50 @@ static int dgram_sctp_new(BIO *bi) | |||
| 968 | #ifdef SCTP_PR_SCTP_NONE | 974 | #ifdef SCTP_PR_SCTP_NONE |
| 969 | data->prinfo.pr_policy = SCTP_PR_SCTP_NONE; | 975 | data->prinfo.pr_policy = SCTP_PR_SCTP_NONE; |
| 970 | #endif | 976 | #endif |
| 971 | bi->ptr = data; | 977 | bi->ptr = data; |
| 972 | 978 | ||
| 973 | bi->flags=0; | 979 | bi->flags = 0; |
| 974 | return(1); | 980 | return (1); |
| 975 | } | 981 | } |
| 976 | 982 | ||
| 977 | static int dgram_sctp_free(BIO *a) | 983 | static int |
| 978 | { | 984 | dgram_sctp_free(BIO *a) |
| 985 | { | ||
| 979 | bio_dgram_sctp_data *data; | 986 | bio_dgram_sctp_data *data; |
| 980 | 987 | ||
| 981 | if (a == NULL) return(0); | 988 | if (a == NULL) |
| 982 | if ( ! dgram_clear(a)) | 989 | return (0); |
| 990 | if (! dgram_clear(a)) | ||
| 983 | return 0; | 991 | return 0; |
| 984 | 992 | ||
| 985 | data = (bio_dgram_sctp_data *)a->ptr; | 993 | data = (bio_dgram_sctp_data *)a->ptr; |
| 986 | if(data != NULL) OPENSSL_free(data); | 994 | if (data != NULL) |
| 995 | OPENSSL_free(data); | ||
| 987 | 996 | ||
| 988 | return(1); | 997 | return (1); |
| 989 | } | 998 | } |
| 990 | 999 | ||
| 991 | #ifdef SCTP_AUTHENTICATION_EVENT | 1000 | #ifdef SCTP_AUTHENTICATION_EVENT |
| 992 | void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp) | 1001 | void |
| 993 | { | 1002 | dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp) |
| 1003 | { | ||
| 994 | int ret; | 1004 | int ret; |
| 995 | struct sctp_authkey_event* authkeyevent = &snp->sn_auth_event; | 1005 | struct sctp_authkey_event* authkeyevent = &snp->sn_auth_event; |
| 996 | 1006 | ||
| 997 | if (authkeyevent->auth_indication == SCTP_AUTH_FREE_KEY) | 1007 | if (authkeyevent->auth_indication == SCTP_AUTH_FREE_KEY) { |
| 998 | { | ||
| 999 | struct sctp_authkeyid authkeyid; | 1008 | struct sctp_authkeyid authkeyid; |
| 1000 | 1009 | ||
| 1001 | /* delete key */ | 1010 | /* delete key */ |
| 1002 | authkeyid.scact_keynumber = authkeyevent->auth_keynumber; | 1011 | authkeyid.scact_keynumber = authkeyevent->auth_keynumber; |
| 1003 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, | 1012 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, |
| 1004 | &authkeyid, sizeof(struct sctp_authkeyid)); | 1013 | &authkeyid, sizeof(struct sctp_authkeyid)); |
| 1005 | } | ||
| 1006 | } | 1014 | } |
| 1015 | } | ||
| 1007 | #endif | 1016 | #endif |
| 1008 | 1017 | ||
| 1009 | static int dgram_sctp_read(BIO *b, char *out, int outl) | 1018 | static int |
| 1010 | { | 1019 | dgram_sctp_read(BIO *b, char *out, int outl) |
| 1020 | { | ||
| 1011 | int ret = 0, n = 0, i, optval; | 1021 | int ret = 0, n = 0, i, optval; |
| 1012 | socklen_t optlen; | 1022 | socklen_t optlen; |
| 1013 | bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr; | 1023 | bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr; |
| @@ -1017,12 +1027,10 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1017 | struct cmsghdr *cmsg; | 1027 | struct cmsghdr *cmsg; |
| 1018 | char cmsgbuf[512]; | 1028 | char cmsgbuf[512]; |
| 1019 | 1029 | ||
| 1020 | if (out != NULL) | 1030 | if (out != NULL) { |
| 1021 | { | ||
| 1022 | errno = 0; | 1031 | errno = 0; |
| 1023 | 1032 | ||
| 1024 | do | 1033 | do { |
| 1025 | { | ||
| 1026 | memset(&data->rcvinfo, 0x00, sizeof(struct bio_dgram_sctp_rcvinfo)); | 1034 | memset(&data->rcvinfo, 0x00, sizeof(struct bio_dgram_sctp_rcvinfo)); |
| 1027 | iov.iov_base = out; | 1035 | iov.iov_base = out; |
| 1028 | iov.iov_len = outl; | 1036 | iov.iov_len = outl; |
| @@ -1035,15 +1043,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1035 | msg.msg_flags = 0; | 1043 | msg.msg_flags = 0; |
| 1036 | n = recvmsg(b->num, &msg, 0); | 1044 | n = recvmsg(b->num, &msg, 0); |
| 1037 | 1045 | ||
| 1038 | if (msg.msg_controllen > 0) | 1046 | if (msg.msg_controllen > 0) { |
| 1039 | { | 1047 | for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { |
| 1040 | for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) | ||
| 1041 | { | ||
| 1042 | if (cmsg->cmsg_level != IPPROTO_SCTP) | 1048 | if (cmsg->cmsg_level != IPPROTO_SCTP) |
| 1043 | continue; | 1049 | continue; |
| 1044 | #ifdef SCTP_RCVINFO | 1050 | #ifdef SCTP_RCVINFO |
| 1045 | if (cmsg->cmsg_type == SCTP_RCVINFO) | 1051 | if (cmsg->cmsg_type == SCTP_RCVINFO) { |
| 1046 | { | ||
| 1047 | struct sctp_rcvinfo *rcvinfo; | 1052 | struct sctp_rcvinfo *rcvinfo; |
| 1048 | 1053 | ||
| 1049 | rcvinfo = (struct sctp_rcvinfo *)CMSG_DATA(cmsg); | 1054 | rcvinfo = (struct sctp_rcvinfo *)CMSG_DATA(cmsg); |
| @@ -1054,11 +1059,10 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1054 | data->rcvinfo.rcv_tsn = rcvinfo->rcv_tsn; | 1059 | data->rcvinfo.rcv_tsn = rcvinfo->rcv_tsn; |
| 1055 | data->rcvinfo.rcv_cumtsn = rcvinfo->rcv_cumtsn; | 1060 | data->rcvinfo.rcv_cumtsn = rcvinfo->rcv_cumtsn; |
| 1056 | data->rcvinfo.rcv_context = rcvinfo->rcv_context; | 1061 | data->rcvinfo.rcv_context = rcvinfo->rcv_context; |
| 1057 | } | 1062 | } |
| 1058 | #endif | 1063 | #endif |
| 1059 | #ifdef SCTP_SNDRCV | 1064 | #ifdef SCTP_SNDRCV |
| 1060 | if (cmsg->cmsg_type == SCTP_SNDRCV) | 1065 | if (cmsg->cmsg_type == SCTP_SNDRCV) { |
| 1061 | { | ||
| 1062 | struct sctp_sndrcvinfo *sndrcvinfo; | 1066 | struct sctp_sndrcvinfo *sndrcvinfo; |
| 1063 | 1067 | ||
| 1064 | sndrcvinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg); | 1068 | sndrcvinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg); |
| @@ -1069,23 +1073,20 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1069 | data->rcvinfo.rcv_tsn = sndrcvinfo->sinfo_tsn; | 1073 | data->rcvinfo.rcv_tsn = sndrcvinfo->sinfo_tsn; |
| 1070 | data->rcvinfo.rcv_cumtsn = sndrcvinfo->sinfo_cumtsn; | 1074 | data->rcvinfo.rcv_cumtsn = sndrcvinfo->sinfo_cumtsn; |
| 1071 | data->rcvinfo.rcv_context = sndrcvinfo->sinfo_context; | 1075 | data->rcvinfo.rcv_context = sndrcvinfo->sinfo_context; |
| 1072 | } | ||
| 1073 | #endif | ||
| 1074 | } | 1076 | } |
| 1077 | #endif | ||
| 1075 | } | 1078 | } |
| 1079 | } | ||
| 1076 | 1080 | ||
| 1077 | if (n <= 0) | 1081 | if (n <= 0) { |
| 1078 | { | ||
| 1079 | if (n < 0) | 1082 | if (n < 0) |
| 1080 | ret = n; | 1083 | ret = n; |
| 1081 | break; | 1084 | break; |
| 1082 | } | 1085 | } |
| 1083 | 1086 | ||
| 1084 | if (msg.msg_flags & MSG_NOTIFICATION) | 1087 | if (msg.msg_flags & MSG_NOTIFICATION) { |
| 1085 | { | ||
| 1086 | snp = (union sctp_notification*) out; | 1088 | snp = (union sctp_notification*) out; |
| 1087 | if (snp->sn_header.sn_type == SCTP_SENDER_DRY_EVENT) | 1089 | if (snp->sn_header.sn_type == SCTP_SENDER_DRY_EVENT) { |
| 1088 | { | ||
| 1089 | #ifdef SCTP_EVENT | 1090 | #ifdef SCTP_EVENT |
| 1090 | struct sctp_event event; | 1091 | struct sctp_event event; |
| 1091 | #else | 1092 | #else |
| @@ -1095,13 +1096,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1095 | /* If a message has been delayed until the socket | 1096 | /* If a message has been delayed until the socket |
| 1096 | * is dry, it can be sent now. | 1097 | * is dry, it can be sent now. |
| 1097 | */ | 1098 | */ |
| 1098 | if (data->saved_message.length > 0) | 1099 | if (data->saved_message.length > 0) { |
| 1099 | { | ||
| 1100 | dgram_sctp_write(data->saved_message.bio, data->saved_message.data, | 1100 | dgram_sctp_write(data->saved_message.bio, data->saved_message.data, |
| 1101 | data->saved_message.length); | 1101 | data->saved_message.length); |
| 1102 | OPENSSL_free(data->saved_message.data); | 1102 | OPENSSL_free(data->saved_message.data); |
| 1103 | data->saved_message.length = 0; | 1103 | data->saved_message.length = 0; |
| 1104 | } | 1104 | } |
| 1105 | 1105 | ||
| 1106 | /* disable sender dry event */ | 1106 | /* disable sender dry event */ |
| 1107 | #ifdef SCTP_EVENT | 1107 | #ifdef SCTP_EVENT |
| @@ -1121,7 +1121,7 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1121 | i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); | 1121 | i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); |
| 1122 | OPENSSL_assert(i >= 0); | 1122 | OPENSSL_assert(i >= 0); |
| 1123 | #endif | 1123 | #endif |
| 1124 | } | 1124 | } |
| 1125 | 1125 | ||
| 1126 | #ifdef SCTP_AUTHENTICATION_EVENT | 1126 | #ifdef SCTP_AUTHENTICATION_EVENT |
| 1127 | if (snp->sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) | 1127 | if (snp->sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) |
| @@ -1132,14 +1132,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1132 | data->handle_notifications(b, data->notification_context, (void*) out); | 1132 | data->handle_notifications(b, data->notification_context, (void*) out); |
| 1133 | 1133 | ||
| 1134 | memset(out, 0, outl); | 1134 | memset(out, 0, outl); |
| 1135 | } | 1135 | } else |
| 1136 | else | ||
| 1137 | ret += n; | 1136 | ret += n; |
| 1138 | } | 1137 | } |
| 1139 | while ((msg.msg_flags & MSG_NOTIFICATION) && (msg.msg_flags & MSG_EOR) && (ret < outl)); | 1138 | while ((msg.msg_flags & MSG_NOTIFICATION) && (msg.msg_flags & MSG_EOR) && (ret < outl)); |
| 1140 | 1139 | ||
| 1141 | if (ret > 0 && !(msg.msg_flags & MSG_EOR)) | 1140 | if (ret > 0 && !(msg.msg_flags & MSG_EOR)) { |
| 1142 | { | ||
| 1143 | /* Partial message read, this should never happen! */ | 1141 | /* Partial message read, this should never happen! */ |
| 1144 | 1142 | ||
| 1145 | /* The buffer was too small, this means the peer sent | 1143 | /* The buffer was too small, this means the peer sent |
| @@ -1159,8 +1157,8 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1159 | * max record size (2^14 + 2048 + 13) | 1157 | * max record size (2^14 + 2048 + 13) |
| 1160 | */ | 1158 | */ |
| 1161 | optlen = (socklen_t) sizeof(int); | 1159 | optlen = (socklen_t) sizeof(int); |
| 1162 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, | 1160 | ret = getsockopt(b->num, IPPROTO_SCTP, |
| 1163 | &optval, &optlen); | 1161 | SCTP_PARTIAL_DELIVERY_POINT, &optval, &optlen); |
| 1164 | OPENSSL_assert(ret >= 0); | 1162 | OPENSSL_assert(ret >= 0); |
| 1165 | OPENSSL_assert(optval >= 18445); | 1163 | OPENSSL_assert(optval >= 18445); |
| 1166 | 1164 | ||
| @@ -1173,21 +1171,18 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1173 | memset(out, 0, outl); | 1171 | memset(out, 0, outl); |
| 1174 | BIO_set_retry_read(b); | 1172 | BIO_set_retry_read(b); |
| 1175 | return -1; | 1173 | return -1; |
| 1176 | } | 1174 | } |
| 1177 | 1175 | ||
| 1178 | BIO_clear_retry_flags(b); | 1176 | BIO_clear_retry_flags(b); |
| 1179 | if (ret < 0) | 1177 | if (ret < 0) { |
| 1180 | { | 1178 | if (BIO_dgram_should_retry(ret)) { |
| 1181 | if (BIO_dgram_should_retry(ret)) | ||
| 1182 | { | ||
| 1183 | BIO_set_retry_read(b); | 1179 | BIO_set_retry_read(b); |
| 1184 | data->_errno = errno; | 1180 | data->_errno = errno; |
| 1185 | } | ||
| 1186 | } | 1181 | } |
| 1182 | } | ||
| 1187 | 1183 | ||
| 1188 | /* Test if peer uses SCTP-AUTH before continuing */ | 1184 | /* Test if peer uses SCTP-AUTH before continuing */ |
| 1189 | if (!data->peer_auth_tested) | 1185 | if (!data->peer_auth_tested) { |
| 1190 | { | ||
| 1191 | int ii, auth_data = 0, auth_forward = 0; | 1186 | int ii, auth_data = 0, auth_forward = 0; |
| 1192 | unsigned char *p; | 1187 | unsigned char *p; |
| 1193 | struct sctp_authchunks *authchunks; | 1188 | struct sctp_authchunks *authchunks; |
| @@ -1199,29 +1194,30 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1199 | OPENSSL_assert(ii >= 0); | 1194 | OPENSSL_assert(ii >= 0); |
| 1200 | 1195 | ||
| 1201 | for (p = (unsigned char*) authchunks->gauth_chunks; | 1196 | for (p = (unsigned char*) authchunks->gauth_chunks; |
| 1202 | p < (unsigned char*) authchunks + optlen; | 1197 | p < (unsigned char*) authchunks + optlen; |
| 1203 | p += sizeof(uint8_t)) | 1198 | p += sizeof(uint8_t)) { |
| 1204 | { | 1199 | if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) |
| 1205 | if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) auth_data = 1; | 1200 | auth_data = 1; |
| 1206 | if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) auth_forward = 1; | 1201 | if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) |
| 1207 | } | 1202 | auth_forward = 1; |
| 1203 | } | ||
| 1208 | 1204 | ||
| 1209 | OPENSSL_free(authchunks); | 1205 | OPENSSL_free(authchunks); |
| 1210 | 1206 | ||
| 1211 | if (!auth_data || !auth_forward) | 1207 | if (!auth_data || !auth_forward) { |
| 1212 | { | 1208 | BIOerr(BIO_F_DGRAM_SCTP_READ, BIO_R_CONNECT_ERROR); |
| 1213 | BIOerr(BIO_F_DGRAM_SCTP_READ,BIO_R_CONNECT_ERROR); | ||
| 1214 | return -1; | 1209 | return -1; |
| 1215 | } | 1210 | } |
| 1216 | 1211 | ||
| 1217 | data->peer_auth_tested = 1; | 1212 | data->peer_auth_tested = 1; |
| 1218 | } | ||
| 1219 | } | 1213 | } |
| 1220 | return(ret); | ||
| 1221 | } | 1214 | } |
| 1215 | return (ret); | ||
| 1216 | } | ||
| 1222 | 1217 | ||
| 1223 | static int dgram_sctp_write(BIO *b, const char *in, int inl) | 1218 | static int |
| 1224 | { | 1219 | dgram_sctp_write(BIO *b, const char *in, int inl) |
| 1220 | { | ||
| 1225 | int ret; | 1221 | int ret; |
| 1226 | bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr; | 1222 | bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr; |
| 1227 | struct bio_dgram_sctp_sndinfo *sinfo = &(data->sndinfo); | 1223 | struct bio_dgram_sctp_sndinfo *sinfo = &(data->sndinfo); |
| @@ -1256,8 +1252,7 @@ static int dgram_sctp_write(BIO *b, const char *in, int inl) | |||
| 1256 | * socket is not dry yet, we have to save it and send it | 1252 | * socket is not dry yet, we have to save it and send it |
| 1257 | * as soon as the socket gets dry. | 1253 | * as soon as the socket gets dry. |
| 1258 | */ | 1254 | */ |
| 1259 | if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) | 1255 | if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) { |
| 1260 | { | ||
| 1261 | data->saved_message.bio = b; | 1256 | data->saved_message.bio = b; |
| 1262 | data->saved_message.length = inl; | 1257 | data->saved_message.length = inl; |
| 1263 | data->saved_message.data = OPENSSL_malloc(inl); | 1258 | data->saved_message.data = OPENSSL_malloc(inl); |
| @@ -1317,20 +1312,20 @@ static int dgram_sctp_write(BIO *b, const char *in, int inl) | |||
| 1317 | ret = sendmsg(b->num, &msg, 0); | 1312 | ret = sendmsg(b->num, &msg, 0); |
| 1318 | 1313 | ||
| 1319 | BIO_clear_retry_flags(b); | 1314 | BIO_clear_retry_flags(b); |
| 1320 | if (ret <= 0) | 1315 | if (ret <= 0) { |
| 1321 | { | 1316 | if (BIO_dgram_should_retry(ret)) { |
| 1322 | if (BIO_dgram_should_retry(ret)) | 1317 | BIO_set_retry_write(b); |
| 1323 | { | 1318 | |
| 1324 | BIO_set_retry_write(b); | ||
| 1325 | data->_errno = errno; | 1319 | data->_errno = errno; |
| 1326 | } | ||
| 1327 | } | 1320 | } |
| 1328 | return(ret); | ||
| 1329 | } | 1321 | } |
| 1322 | return (ret); | ||
| 1323 | } | ||
| 1330 | 1324 | ||
| 1331 | static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | 1325 | static long |
| 1332 | { | 1326 | dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 1333 | long ret=1; | 1327 | { |
| 1328 | long ret = 1; | ||
| 1334 | bio_dgram_sctp_data *data = NULL; | 1329 | bio_dgram_sctp_data *data = NULL; |
| 1335 | socklen_t sockopt_len = 0; | 1330 | socklen_t sockopt_len = 0; |
| 1336 | struct sctp_authkeyid authkeyid; | 1331 | struct sctp_authkeyid authkeyid; |
| @@ -1338,8 +1333,7 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1338 | 1333 | ||
| 1339 | data = (bio_dgram_sctp_data *)b->ptr; | 1334 | data = (bio_dgram_sctp_data *)b->ptr; |
| 1340 | 1335 | ||
| 1341 | switch (cmd) | 1336 | switch (cmd) { |
| 1342 | { | ||
| 1343 | case BIO_CTRL_DGRAM_QUERY_MTU: | 1337 | case BIO_CTRL_DGRAM_QUERY_MTU: |
| 1344 | /* Set to maximum (2^14) | 1338 | /* Set to maximum (2^14) |
| 1345 | * and ignore user input to enable transport | 1339 | * and ignore user input to enable transport |
| @@ -1384,7 +1378,8 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1384 | /* Get active key */ | 1378 | /* Get active key */ |
| 1385 | sockopt_len = sizeof(struct sctp_authkeyid); | 1379 | sockopt_len = sizeof(struct sctp_authkeyid); |
| 1386 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); | 1380 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); |
| 1387 | if (ret < 0) break; | 1381 | if (ret < 0) |
| 1382 | break; | ||
| 1388 | 1383 | ||
| 1389 | /* Add new key */ | 1384 | /* Add new key */ |
| 1390 | sockopt_len = sizeof(struct sctp_authkey) + 64 * sizeof(uint8_t); | 1385 | sockopt_len = sizeof(struct sctp_authkey) + 64 * sizeof(uint8_t); |
| @@ -1400,12 +1395,14 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1400 | memcpy(&authkey->sca_key[0], ptr, 64 * sizeof(uint8_t)); | 1395 | memcpy(&authkey->sca_key[0], ptr, 64 * sizeof(uint8_t)); |
| 1401 | 1396 | ||
| 1402 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_KEY, authkey, sockopt_len); | 1397 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_KEY, authkey, sockopt_len); |
| 1403 | if (ret < 0) break; | 1398 | if (ret < 0) |
| 1399 | break; | ||
| 1404 | 1400 | ||
| 1405 | /* Reset active key */ | 1401 | /* Reset active key */ |
| 1406 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, | 1402 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, |
| 1407 | &authkeyid, sizeof(struct sctp_authkeyid)); | 1403 | &authkeyid, sizeof(struct sctp_authkeyid)); |
| 1408 | if (ret < 0) break; | 1404 | if (ret < 0) |
| 1405 | break; | ||
| 1409 | 1406 | ||
| 1410 | break; | 1407 | break; |
| 1411 | case BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY: | 1408 | case BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY: |
| @@ -1414,13 +1411,15 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1414 | /* Get active key */ | 1411 | /* Get active key */ |
| 1415 | sockopt_len = sizeof(struct sctp_authkeyid); | 1412 | sockopt_len = sizeof(struct sctp_authkeyid); |
| 1416 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); | 1413 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); |
| 1417 | if (ret < 0) break; | 1414 | if (ret < 0) |
| 1415 | break; | ||
| 1418 | 1416 | ||
| 1419 | /* Set active key */ | 1417 | /* Set active key */ |
| 1420 | authkeyid.scact_keynumber = authkeyid.scact_keynumber + 1; | 1418 | authkeyid.scact_keynumber = authkeyid.scact_keynumber + 1; |
| 1421 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, | 1419 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, |
| 1422 | &authkeyid, sizeof(struct sctp_authkeyid)); | 1420 | &authkeyid, sizeof(struct sctp_authkeyid)); |
| 1423 | if (ret < 0) break; | 1421 | if (ret < 0) |
| 1422 | break; | ||
| 1424 | 1423 | ||
| 1425 | /* CCS has been sent, so remember that and fall through | 1424 | /* CCS has been sent, so remember that and fall through |
| 1426 | * to check if we need to deactivate an old key | 1425 | * to check if we need to deactivate an old key |
| @@ -1435,12 +1434,12 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1435 | data->ccs_rcvd = 1; | 1434 | data->ccs_rcvd = 1; |
| 1436 | 1435 | ||
| 1437 | /* CSS has been both, received and sent, so deactivate an old key */ | 1436 | /* CSS has been both, received and sent, so deactivate an old key */ |
| 1438 | if (data->ccs_rcvd == 1 && data->ccs_sent == 1) | 1437 | if (data->ccs_rcvd == 1 && data->ccs_sent == 1) { |
| 1439 | { | ||
| 1440 | /* Get active key */ | 1438 | /* Get active key */ |
| 1441 | sockopt_len = sizeof(struct sctp_authkeyid); | 1439 | sockopt_len = sizeof(struct sctp_authkeyid); |
| 1442 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); | 1440 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); |
| 1443 | if (ret < 0) break; | 1441 | if (ret < 0) |
| 1442 | break; | ||
| 1444 | 1443 | ||
| 1445 | /* Deactivate key or delete second last key if | 1444 | /* Deactivate key or delete second last key if |
| 1446 | * SCTP_AUTHENTICATION_EVENT is not available. | 1445 | * SCTP_AUTHENTICATION_EVENT is not available. |
| @@ -1449,22 +1448,23 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1449 | #ifdef SCTP_AUTH_DEACTIVATE_KEY | 1448 | #ifdef SCTP_AUTH_DEACTIVATE_KEY |
| 1450 | sockopt_len = sizeof(struct sctp_authkeyid); | 1449 | sockopt_len = sizeof(struct sctp_authkeyid); |
| 1451 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY, | 1450 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY, |
| 1452 | &authkeyid, sockopt_len); | 1451 | &authkeyid, sockopt_len); |
| 1453 | if (ret < 0) break; | 1452 | if (ret < 0) |
| 1453 | break; | ||
| 1454 | #endif | 1454 | #endif |
| 1455 | #ifndef SCTP_AUTHENTICATION_EVENT | 1455 | #ifndef SCTP_AUTHENTICATION_EVENT |
| 1456 | if (authkeyid.scact_keynumber > 0) | 1456 | if (authkeyid.scact_keynumber > 0) { |
| 1457 | { | ||
| 1458 | authkeyid.scact_keynumber = authkeyid.scact_keynumber - 1; | 1457 | authkeyid.scact_keynumber = authkeyid.scact_keynumber - 1; |
| 1459 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, | 1458 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, |
| 1460 | &authkeyid, sizeof(struct sctp_authkeyid)); | 1459 | &authkeyid, sizeof(struct sctp_authkeyid)); |
| 1461 | if (ret < 0) break; | 1460 | if (ret < 0) |
| 1462 | } | 1461 | break; |
| 1462 | } | ||
| 1463 | #endif | 1463 | #endif |
| 1464 | 1464 | ||
| 1465 | data->ccs_rcvd = 0; | 1465 | data->ccs_rcvd = 0; |
| 1466 | data->ccs_sent = 0; | 1466 | data->ccs_sent = 0; |
| 1467 | } | 1467 | } |
| 1468 | break; | 1468 | break; |
| 1469 | case BIO_CTRL_DGRAM_SCTP_GET_SNDINFO: | 1469 | case BIO_CTRL_DGRAM_SCTP_GET_SNDINFO: |
| 1470 | /* Returns the size of the copied struct. */ | 1470 | /* Returns the size of the copied struct. */ |
| @@ -1524,30 +1524,30 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1524 | /* Pass to default ctrl function to | 1524 | /* Pass to default ctrl function to |
| 1525 | * process SCTP unspecific commands | 1525 | * process SCTP unspecific commands |
| 1526 | */ | 1526 | */ |
| 1527 | ret=dgram_ctrl(b, cmd, num, ptr); | 1527 | ret = dgram_ctrl(b, cmd, num, ptr); |
| 1528 | break; | 1528 | break; |
| 1529 | } | ||
| 1530 | return(ret); | ||
| 1531 | } | 1529 | } |
| 1530 | return (ret); | ||
| 1531 | } | ||
| 1532 | 1532 | ||
| 1533 | int BIO_dgram_sctp_notification_cb(BIO *b, | 1533 | int |
| 1534 | void (*handle_notifications)(BIO *bio, void *context, void *buf), | 1534 | BIO_dgram_sctp_notification_cb(BIO *b, |
| 1535 | void *context) | 1535 | void (*handle_notifications)(BIO *bio, void *context, void *buf), |
| 1536 | { | 1536 | void *context) |
| 1537 | { | ||
| 1537 | bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr; | 1538 | bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr; |
| 1538 | 1539 | ||
| 1539 | if (handle_notifications != NULL) | 1540 | if (handle_notifications != NULL) { |
| 1540 | { | ||
| 1541 | data->handle_notifications = handle_notifications; | 1541 | data->handle_notifications = handle_notifications; |
| 1542 | data->notification_context = context; | 1542 | data->notification_context = context; |
| 1543 | } | 1543 | } else |
| 1544 | else | ||
| 1545 | return -1; | 1544 | return -1; |
| 1546 | 1545 | ||
| 1547 | return 0; | 1546 | return 0; |
| 1548 | } | 1547 | } |
| 1549 | 1548 | ||
| 1550 | int BIO_dgram_sctp_wait_for_dry(BIO *b) | 1549 | int |
| 1550 | BIO_dgram_sctp_wait_for_dry(BIO *b) | ||
| 1551 | { | 1551 | { |
| 1552 | int is_dry = 0; | 1552 | int is_dry = 0; |
| 1553 | int n, sockflags, ret; | 1553 | int n, sockflags, ret; |
| @@ -1574,9 +1574,9 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b) | |||
| 1574 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize); | 1574 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize); |
| 1575 | if (ret < 0) | 1575 | if (ret < 0) |
| 1576 | return -1; | 1576 | return -1; |
| 1577 | 1577 | ||
| 1578 | event.sctp_sender_dry_event = 1; | 1578 | event.sctp_sender_dry_event = 1; |
| 1579 | 1579 | ||
| 1580 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); | 1580 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); |
| 1581 | #endif | 1581 | #endif |
| 1582 | if (ret < 0) | 1582 | if (ret < 0) |
| @@ -1595,17 +1595,15 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b) | |||
| 1595 | msg.msg_flags = 0; | 1595 | msg.msg_flags = 0; |
| 1596 | 1596 | ||
| 1597 | n = recvmsg(b->num, &msg, MSG_PEEK); | 1597 | n = recvmsg(b->num, &msg, MSG_PEEK); |
| 1598 | if (n <= 0) | 1598 | if (n <= 0) { |
| 1599 | { | ||
| 1600 | if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) | 1599 | if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) |
| 1601 | return -1; | 1600 | return -1; |
| 1602 | else | 1601 | else |
| 1603 | return 0; | 1602 | return 0; |
| 1604 | } | 1603 | } |
| 1605 | 1604 | ||
| 1606 | /* if we find a notification, process it and try again if necessary */ | 1605 | /* if we find a notification, process it and try again if necessary */ |
| 1607 | while (msg.msg_flags & MSG_NOTIFICATION) | 1606 | while (msg.msg_flags & MSG_NOTIFICATION) { |
| 1608 | { | ||
| 1609 | memset(&snp, 0x00, sizeof(union sctp_notification)); | 1607 | memset(&snp, 0x00, sizeof(union sctp_notification)); |
| 1610 | iov.iov_base = (char *)&snp; | 1608 | iov.iov_base = (char *)&snp; |
| 1611 | iov.iov_len = sizeof(union sctp_notification); | 1609 | iov.iov_len = sizeof(union sctp_notification); |
| @@ -1618,16 +1616,14 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b) | |||
| 1618 | msg.msg_flags = 0; | 1616 | msg.msg_flags = 0; |
| 1619 | 1617 | ||
| 1620 | n = recvmsg(b->num, &msg, 0); | 1618 | n = recvmsg(b->num, &msg, 0); |
| 1621 | if (n <= 0) | 1619 | if (n <= 0) { |
| 1622 | { | ||
| 1623 | if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) | 1620 | if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) |
| 1624 | return -1; | 1621 | return -1; |
| 1625 | else | 1622 | else |
| 1626 | return is_dry; | 1623 | return is_dry; |
| 1627 | } | 1624 | } |
| 1628 | 1625 | ||
| 1629 | if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT) | 1626 | if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT) { |
| 1630 | { | ||
| 1631 | is_dry = 1; | 1627 | is_dry = 1; |
| 1632 | 1628 | ||
| 1633 | /* disable sender dry event */ | 1629 | /* disable sender dry event */ |
| @@ -1649,7 +1645,7 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b) | |||
| 1649 | #endif | 1645 | #endif |
| 1650 | if (ret < 0) | 1646 | if (ret < 0) |
| 1651 | return -1; | 1647 | return -1; |
| 1652 | } | 1648 | } |
| 1653 | 1649 | ||
| 1654 | #ifdef SCTP_AUTHENTICATION_EVENT | 1650 | #ifdef SCTP_AUTHENTICATION_EVENT |
| 1655 | if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) | 1651 | if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) |
| @@ -1672,34 +1668,32 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b) | |||
| 1672 | msg.msg_flags = 0; | 1668 | msg.msg_flags = 0; |
| 1673 | 1669 | ||
| 1674 | /* if we have seen the dry already, don't wait */ | 1670 | /* if we have seen the dry already, don't wait */ |
| 1675 | if (is_dry) | 1671 | if (is_dry) { |
| 1676 | { | ||
| 1677 | sockflags = fcntl(b->num, F_GETFL, 0); | 1672 | sockflags = fcntl(b->num, F_GETFL, 0); |
| 1678 | fcntl(b->num, F_SETFL, O_NONBLOCK); | 1673 | fcntl(b->num, F_SETFL, O_NONBLOCK); |
| 1679 | } | 1674 | } |
| 1680 | 1675 | ||
| 1681 | n = recvmsg(b->num, &msg, MSG_PEEK); | 1676 | n = recvmsg(b->num, &msg, MSG_PEEK); |
| 1682 | 1677 | ||
| 1683 | if (is_dry) | 1678 | if (is_dry) { |
| 1684 | { | ||
| 1685 | fcntl(b->num, F_SETFL, sockflags); | 1679 | fcntl(b->num, F_SETFL, sockflags); |
| 1686 | } | 1680 | } |
| 1687 | 1681 | ||
| 1688 | if (n <= 0) | 1682 | if (n <= 0) { |
| 1689 | { | ||
| 1690 | if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) | 1683 | if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) |
| 1691 | return -1; | 1684 | return -1; |
| 1692 | else | 1685 | else |
| 1693 | return is_dry; | 1686 | return is_dry; |
| 1694 | } | ||
| 1695 | } | 1687 | } |
| 1688 | } | ||
| 1696 | 1689 | ||
| 1697 | /* read anything else */ | 1690 | /* read anything else */ |
| 1698 | return is_dry; | 1691 | return is_dry; |
| 1699 | } | 1692 | } |
| 1700 | 1693 | ||
| 1701 | int BIO_dgram_sctp_msg_waiting(BIO *b) | 1694 | int |
| 1702 | { | 1695 | BIO_dgram_sctp_msg_waiting(BIO *b) |
| 1696 | { | ||
| 1703 | int n, sockflags; | 1697 | int n, sockflags; |
| 1704 | union sctp_notification snp; | 1698 | union sctp_notification snp; |
| 1705 | struct msghdr msg; | 1699 | struct msghdr msg; |
| @@ -1708,7 +1702,7 @@ int BIO_dgram_sctp_msg_waiting(BIO *b) | |||
| 1708 | 1702 | ||
| 1709 | /* Check if there are any messages waiting to be read */ | 1703 | /* Check if there are any messages waiting to be read */ |
| 1710 | do | 1704 | do |
| 1711 | { | 1705 | { |
| 1712 | memset(&snp, 0x00, sizeof(union sctp_notification)); | 1706 | memset(&snp, 0x00, sizeof(union sctp_notification)); |
| 1713 | iov.iov_base = (char *)&snp; | 1707 | iov.iov_base = (char *)&snp; |
| 1714 | iov.iov_len = sizeof(union sctp_notification); | 1708 | iov.iov_len = sizeof(union sctp_notification); |
| @@ -1726,8 +1720,7 @@ int BIO_dgram_sctp_msg_waiting(BIO *b) | |||
| 1726 | fcntl(b->num, F_SETFL, sockflags); | 1720 | fcntl(b->num, F_SETFL, sockflags); |
| 1727 | 1721 | ||
| 1728 | /* if notification, process and try again */ | 1722 | /* if notification, process and try again */ |
| 1729 | if (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)) | 1723 | if (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)) { |
| 1730 | { | ||
| 1731 | #ifdef SCTP_AUTHENTICATION_EVENT | 1724 | #ifdef SCTP_AUTHENTICATION_EVENT |
| 1732 | if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) | 1725 | if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) |
| 1733 | dgram_sctp_handle_auth_free_key_event(b, &snp); | 1726 | dgram_sctp_handle_auth_free_key_event(b, &snp); |
| @@ -1747,34 +1740,35 @@ int BIO_dgram_sctp_msg_waiting(BIO *b) | |||
| 1747 | 1740 | ||
| 1748 | if (data->handle_notifications != NULL) | 1741 | if (data->handle_notifications != NULL) |
| 1749 | data->handle_notifications(b, data->notification_context, (void*) &snp); | 1742 | data->handle_notifications(b, data->notification_context, (void*) &snp); |
| 1750 | } | 1743 | } |
| 1751 | 1744 | ||
| 1752 | } while (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)); | 1745 | } while (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)); |
| 1753 | 1746 | ||
| 1754 | /* Return 1 if there is a message to be read, return 0 otherwise. */ | 1747 | /* Return 1 if there is a message to be read, return 0 otherwise. */ |
| 1755 | if (n > 0) | 1748 | if (n > 0) |
| 1756 | return 1; | 1749 | return 1; |
| 1757 | else | 1750 | else |
| 1758 | return 0; | 1751 | return 0; |
| 1759 | } | 1752 | } |
| 1760 | 1753 | ||
| 1761 | static int dgram_sctp_puts(BIO *bp, const char *str) | 1754 | static int |
| 1762 | { | 1755 | dgram_sctp_puts(BIO *bp, const char *str) |
| 1763 | int n,ret; | 1756 | { |
| 1757 | int n, ret; | ||
| 1764 | 1758 | ||
| 1765 | n=strlen(str); | 1759 | n = strlen(str); |
| 1766 | ret=dgram_sctp_write(bp,str,n); | 1760 | ret = dgram_sctp_write(bp, str, n); |
| 1767 | return(ret); | 1761 | return (ret); |
| 1768 | } | 1762 | } |
| 1769 | #endif | 1763 | #endif |
| 1770 | 1764 | ||
| 1771 | static int BIO_dgram_should_retry(int i) | 1765 | static int |
| 1772 | { | 1766 | BIO_dgram_should_retry(int i) |
| 1767 | { | ||
| 1773 | int err; | 1768 | int err; |
| 1774 | 1769 | ||
| 1775 | if ((i == 0) || (i == -1)) | 1770 | if ((i == 0) || (i == -1)) { |
| 1776 | { | 1771 | err = errno; |
| 1777 | err=errno; | ||
| 1778 | 1772 | ||
| 1779 | #if defined(OPENSSL_SYS_WINDOWS) | 1773 | #if defined(OPENSSL_SYS_WINDOWS) |
| 1780 | /* If the socket return value (i) is -1 | 1774 | /* If the socket return value (i) is -1 |
| @@ -1785,15 +1779,15 @@ static int BIO_dgram_should_retry(int i) | |||
| 1785 | */ | 1779 | */ |
| 1786 | #endif | 1780 | #endif |
| 1787 | 1781 | ||
| 1788 | return(BIO_dgram_non_fatal_error(err)); | 1782 | return (BIO_dgram_non_fatal_error(err)); |
| 1789 | } | ||
| 1790 | return(0); | ||
| 1791 | } | 1783 | } |
| 1784 | return (0); | ||
| 1785 | } | ||
| 1792 | 1786 | ||
| 1793 | int BIO_dgram_non_fatal_error(int err) | 1787 | int |
| 1794 | { | 1788 | BIO_dgram_non_fatal_error(int err) |
| 1795 | switch (err) | 1789 | { |
| 1796 | { | 1790 | switch (err) { |
| 1797 | #if defined(OPENSSL_SYS_WINDOWS) | 1791 | #if defined(OPENSSL_SYS_WINDOWS) |
| 1798 | # if defined(WSAEWOULDBLOCK) | 1792 | # if defined(WSAEWOULDBLOCK) |
| 1799 | case WSAEWOULDBLOCK: | 1793 | case WSAEWOULDBLOCK: |
| @@ -1838,17 +1832,17 @@ int BIO_dgram_non_fatal_error(int err) | |||
| 1838 | case EALREADY: | 1832 | case EALREADY: |
| 1839 | #endif | 1833 | #endif |
| 1840 | 1834 | ||
| 1841 | return(1); | 1835 | return (1); |
| 1842 | /* break; */ | 1836 | /* break; */ |
| 1843 | default: | 1837 | default: |
| 1844 | break; | 1838 | break; |
| 1845 | } | ||
| 1846 | return(0); | ||
| 1847 | } | 1839 | } |
| 1840 | return (0); | ||
| 1841 | } | ||
| 1848 | 1842 | ||
| 1849 | static void get_current_time(struct timeval *t) | 1843 | static void |
| 1850 | { | 1844 | get_current_time(struct timeval *t) { |
| 1851 | gettimeofday(t, NULL); | 1845 | gettimeofday(t, NULL); |
| 1852 | } | 1846 | } |
| 1853 | 1847 | ||
| 1854 | #endif | 1848 | #endif |
diff --git a/src/lib/libcrypto/bio/bss_fd.c b/src/lib/libcrypto/bio/bss_fd.c index ab18a56310..35ddd61359 100644 --- a/src/lib/libcrypto/bio/bss_fd.c +++ b/src/lib/libcrypto/bio/bss_fd.c | |||
| @@ -90,9 +90,8 @@ static int fd_new(BIO *h); | |||
| 90 | static int fd_free(BIO *data); | 90 | static int fd_free(BIO *data); |
| 91 | int BIO_fd_should_retry(int s); | 91 | int BIO_fd_should_retry(int s); |
| 92 | 92 | ||
| 93 | static BIO_METHOD methods_fdp= | 93 | static BIO_METHOD methods_fdp = { |
| 94 | { | 94 | BIO_TYPE_FD, "file descriptor", |
| 95 | BIO_TYPE_FD,"file descriptor", | ||
| 96 | fd_write, | 95 | fd_write, |
| 97 | fd_read, | 96 | fd_read, |
| 98 | fd_puts, | 97 | fd_puts, |
| @@ -101,178 +100,182 @@ static BIO_METHOD methods_fdp= | |||
| 101 | fd_new, | 100 | fd_new, |
| 102 | fd_free, | 101 | fd_free, |
| 103 | NULL, | 102 | NULL, |
| 104 | }; | 103 | }; |
| 105 | 104 | ||
| 106 | BIO_METHOD *BIO_s_fd(void) | 105 | BIO_METHOD |
| 107 | { | 106 | *BIO_s_fd(void) |
| 108 | return(&methods_fdp); | 107 | { |
| 109 | } | 108 | return (&methods_fdp); |
| 109 | } | ||
| 110 | 110 | ||
| 111 | BIO *BIO_new_fd(int fd,int close_flag) | 111 | BIO |
| 112 | { | 112 | *BIO_new_fd(int fd, int close_flag) |
| 113 | { | ||
| 113 | BIO *ret; | 114 | BIO *ret; |
| 114 | ret=BIO_new(BIO_s_fd()); | 115 | ret = BIO_new(BIO_s_fd()); |
| 115 | if (ret == NULL) return(NULL); | 116 | if (ret == NULL) |
| 116 | BIO_set_fd(ret,fd,close_flag); | 117 | return (NULL); |
| 117 | return(ret); | 118 | BIO_set_fd(ret, fd, close_flag); |
| 118 | } | 119 | return (ret); |
| 120 | } | ||
| 119 | 121 | ||
| 120 | static int fd_new(BIO *bi) | 122 | static int |
| 121 | { | 123 | fd_new(BIO *bi) |
| 122 | bi->init=0; | 124 | { |
| 123 | bi->num=-1; | 125 | bi->init = 0; |
| 124 | bi->ptr=NULL; | 126 | bi->num = -1; |
| 127 | bi->ptr = NULL; | ||
| 125 | bi->flags=BIO_FLAGS_UPLINK; /* essentially redundant */ | 128 | bi->flags=BIO_FLAGS_UPLINK; /* essentially redundant */ |
| 126 | return(1); | 129 | return (1); |
| 127 | } | 130 | } |
| 128 | 131 | ||
| 129 | static int fd_free(BIO *a) | 132 | static int |
| 130 | { | 133 | fd_free(BIO *a) |
| 131 | if (a == NULL) return(0); | 134 | { |
| 132 | if (a->shutdown) | 135 | if (a == NULL) |
| 133 | { | 136 | return (0); |
| 134 | if (a->init) | 137 | if (a->shutdown) { |
| 135 | { | 138 | if (a->init) { |
| 136 | UP_close(a->num); | 139 | UP_close(a->num); |
| 137 | } | ||
| 138 | a->init=0; | ||
| 139 | a->flags=BIO_FLAGS_UPLINK; | ||
| 140 | } | 140 | } |
| 141 | return(1); | 141 | a->init = 0; |
| 142 | a->flags = BIO_FLAGS_UPLINK; | ||
| 142 | } | 143 | } |
| 143 | 144 | return (1); | |
| 144 | static int fd_read(BIO *b, char *out,int outl) | 145 | } |
| 145 | { | ||
| 146 | int ret=0; | ||
| 147 | 146 | ||
| 148 | if (out != NULL) | 147 | static int |
| 149 | { | 148 | fd_read(BIO *b, char *out, int outl) |
| 149 | { | ||
| 150 | int ret = 0; | ||
| 151 | |||
| 152 | if (out != NULL) { | ||
| 150 | errno = 0; | 153 | errno = 0; |
| 151 | ret=UP_read(b->num,out,outl); | 154 | ret = UP_read(b->num, out, outl); |
| 152 | BIO_clear_retry_flags(b); | 155 | BIO_clear_retry_flags(b); |
| 153 | if (ret <= 0) | 156 | if (ret <= 0) { |
| 154 | { | ||
| 155 | if (BIO_fd_should_retry(ret)) | 157 | if (BIO_fd_should_retry(ret)) |
| 156 | BIO_set_retry_read(b); | 158 | BIO_set_retry_read(b); |
| 157 | } | ||
| 158 | } | 159 | } |
| 159 | return(ret); | ||
| 160 | } | 160 | } |
| 161 | return (ret); | ||
| 162 | } | ||
| 161 | 163 | ||
| 162 | static int fd_write(BIO *b, const char *in, int inl) | 164 | static int |
| 163 | { | 165 | fd_write(BIO *b, const char *in, int inl) |
| 166 | { | ||
| 164 | int ret; | 167 | int ret; |
| 165 | errno = 0; | 168 | errno = 0; |
| 166 | ret=UP_write(b->num,in,inl); | 169 | ret = UP_write(b->num, in, inl); |
| 167 | BIO_clear_retry_flags(b); | 170 | BIO_clear_retry_flags(b); |
| 168 | if (ret <= 0) | 171 | if (ret <= 0) { |
| 169 | { | ||
| 170 | if (BIO_fd_should_retry(ret)) | 172 | if (BIO_fd_should_retry(ret)) |
| 171 | BIO_set_retry_write(b); | 173 | BIO_set_retry_write(b); |
| 172 | } | ||
| 173 | return(ret); | ||
| 174 | } | 174 | } |
| 175 | return (ret); | ||
| 176 | } | ||
| 175 | 177 | ||
| 176 | static long fd_ctrl(BIO *b, int cmd, long num, void *ptr) | 178 | static long |
| 177 | { | 179 | fd_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 178 | long ret=1; | 180 | { |
| 181 | long ret = 1; | ||
| 179 | int *ip; | 182 | int *ip; |
| 180 | 183 | ||
| 181 | switch (cmd) | 184 | switch (cmd) { |
| 182 | { | ||
| 183 | case BIO_CTRL_RESET: | 185 | case BIO_CTRL_RESET: |
| 184 | num=0; | 186 | num = 0; |
| 185 | case BIO_C_FILE_SEEK: | 187 | case BIO_C_FILE_SEEK: |
| 186 | ret=(long)UP_lseek(b->num,num,0); | 188 | ret = (long)UP_lseek(b->num, num, 0); |
| 187 | break; | 189 | break; |
| 188 | case BIO_C_FILE_TELL: | 190 | case BIO_C_FILE_TELL: |
| 189 | case BIO_CTRL_INFO: | 191 | case BIO_CTRL_INFO: |
| 190 | ret=(long)UP_lseek(b->num,0,1); | 192 | ret = (long)UP_lseek(b->num, 0, 1); |
| 191 | break; | 193 | break; |
| 192 | case BIO_C_SET_FD: | 194 | case BIO_C_SET_FD: |
| 193 | fd_free(b); | 195 | fd_free(b); |
| 194 | b->num= *((int *)ptr); | 196 | b->num= *((int *)ptr); |
| 195 | b->shutdown=(int)num; | 197 | b->shutdown = (int)num; |
| 196 | b->init=1; | 198 | b->init = 1; |
| 197 | break; | 199 | break; |
| 198 | case BIO_C_GET_FD: | 200 | case BIO_C_GET_FD: |
| 199 | if (b->init) | 201 | if (b->init) { |
| 200 | { | 202 | ip = (int *)ptr; |
| 201 | ip=(int *)ptr; | 203 | if (ip != NULL) |
| 202 | if (ip != NULL) *ip=b->num; | 204 | *ip = b->num; |
| 203 | ret=b->num; | 205 | ret = b->num; |
| 204 | } | 206 | } else |
| 205 | else | 207 | ret = -1; |
| 206 | ret= -1; | ||
| 207 | break; | 208 | break; |
| 208 | case BIO_CTRL_GET_CLOSE: | 209 | case BIO_CTRL_GET_CLOSE: |
| 209 | ret=b->shutdown; | 210 | ret = b->shutdown; |
| 210 | break; | 211 | break; |
| 211 | case BIO_CTRL_SET_CLOSE: | 212 | case BIO_CTRL_SET_CLOSE: |
| 212 | b->shutdown=(int)num; | 213 | b->shutdown = (int)num; |
| 213 | break; | 214 | break; |
| 214 | case BIO_CTRL_PENDING: | 215 | case BIO_CTRL_PENDING: |
| 215 | case BIO_CTRL_WPENDING: | 216 | case BIO_CTRL_WPENDING: |
| 216 | ret=0; | 217 | ret = 0; |
| 217 | break; | 218 | break; |
| 218 | case BIO_CTRL_DUP: | 219 | case BIO_CTRL_DUP: |
| 219 | case BIO_CTRL_FLUSH: | 220 | case BIO_CTRL_FLUSH: |
| 220 | ret=1; | 221 | ret = 1; |
| 221 | break; | 222 | break; |
| 222 | default: | 223 | default: |
| 223 | ret=0; | 224 | ret = 0; |
| 224 | break; | 225 | break; |
| 225 | } | ||
| 226 | return(ret); | ||
| 227 | } | 226 | } |
| 227 | return (ret); | ||
| 228 | } | ||
| 228 | 229 | ||
| 229 | static int fd_puts(BIO *bp, const char *str) | 230 | static int |
| 230 | { | 231 | fd_puts(BIO *bp, const char *str) |
| 231 | int n,ret; | 232 | { |
| 233 | int n, ret; | ||
| 232 | 234 | ||
| 233 | n=strlen(str); | 235 | n = strlen(str); |
| 234 | ret=fd_write(bp,str,n); | 236 | ret = fd_write(bp, str, n); |
| 235 | return(ret); | 237 | return (ret); |
| 236 | } | 238 | } |
| 237 | 239 | ||
| 238 | static int fd_gets(BIO *bp, char *buf, int size) | 240 | static int |
| 239 | { | 241 | fd_gets(BIO *bp, char *buf, int size) |
| 240 | int ret=0; | 242 | { |
| 241 | char *ptr=buf; | 243 | int ret = 0; |
| 242 | char *end=buf+size-1; | 244 | char *ptr = buf; |
| 245 | char *end = buf + size - 1; | ||
| 243 | 246 | ||
| 244 | while ( (ptr < end) && (fd_read(bp, ptr, 1) > 0) && (ptr[0] != '\n') ) | 247 | while ((ptr < end) && (fd_read(bp, ptr, 1) > 0) && (ptr[0] != '\n')) |
| 245 | ptr++; | 248 | ptr++; |
| 246 | 249 | ||
| 247 | ptr[0]='\0'; | 250 | ptr[0] = '\0'; |
| 248 | 251 | ||
| 249 | if (buf[0] != '\0') | 252 | if (buf[0] != '\0') |
| 250 | ret=strlen(buf); | 253 | ret = strlen(buf); |
| 251 | return(ret); | 254 | return (ret); |
| 252 | } | 255 | } |
| 253 | 256 | ||
| 254 | int BIO_fd_should_retry(int i) | 257 | int |
| 255 | { | 258 | BIO_fd_should_retry(int i) |
| 259 | { | ||
| 256 | int err; | 260 | int err; |
| 257 | 261 | ||
| 258 | if ((i == 0) || (i == -1)) | 262 | if ((i == 0) || (i == -1)) { |
| 259 | { | 263 | err = errno; |
| 260 | err=errno; | ||
| 261 | 264 | ||
| 262 | #if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ | 265 | #if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ |
| 263 | if ((i == -1) && (err == 0)) | 266 | if ((i == -1) && (err == 0)) |
| 264 | return(1); | 267 | return (1); |
| 265 | #endif | 268 | #endif |
| 266 | 269 | ||
| 267 | return(BIO_fd_non_fatal_error(err)); | 270 | return (BIO_fd_non_fatal_error(err)); |
| 268 | } | ||
| 269 | return(0); | ||
| 270 | } | 271 | } |
| 272 | return (0); | ||
| 273 | } | ||
| 271 | 274 | ||
| 272 | int BIO_fd_non_fatal_error(int err) | 275 | int |
| 273 | { | 276 | BIO_fd_non_fatal_error(int err) |
| 274 | switch (err) | 277 | { |
| 275 | { | 278 | switch (err) { |
| 276 | 279 | ||
| 277 | #ifdef EWOULDBLOCK | 280 | #ifdef EWOULDBLOCK |
| 278 | # ifdef WSAEWOULDBLOCK | 281 | # ifdef WSAEWOULDBLOCK |
| @@ -309,11 +312,11 @@ int BIO_fd_non_fatal_error(int err) | |||
| 309 | #ifdef EALREADY | 312 | #ifdef EALREADY |
| 310 | case EALREADY: | 313 | case EALREADY: |
| 311 | #endif | 314 | #endif |
| 312 | return(1); | 315 | return (1); |
| 313 | /* break; */ | 316 | /* break; */ |
| 314 | default: | 317 | default: |
| 315 | break; | 318 | break; |
| 316 | } | ||
| 317 | return(0); | ||
| 318 | } | 319 | } |
| 320 | return (0); | ||
| 321 | } | ||
| 319 | #endif | 322 | #endif |
diff --git a/src/lib/libcrypto/bio/bss_file.c b/src/lib/libcrypto/bio/bss_file.c index 638572ab7f..794f503a69 100644 --- a/src/lib/libcrypto/bio/bss_file.c +++ b/src/lib/libcrypto/bio/bss_file.c | |||
| @@ -102,8 +102,8 @@ static int file_gets(BIO *h, char *str, int size); | |||
| 102 | static long file_ctrl(BIO *h, int cmd, long arg1, void *arg2); | 102 | static long file_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 103 | static int file_new(BIO *h); | 103 | static int file_new(BIO *h); |
| 104 | static int file_free(BIO *data); | 104 | static int file_free(BIO *data); |
| 105 | static BIO_METHOD methods_filep= | 105 | |
| 106 | { | 106 | static BIO_METHOD methods_filep = { |
| 107 | BIO_TYPE_FILE, | 107 | BIO_TYPE_FILE, |
| 108 | "FILE pointer", | 108 | "FILE pointer", |
| 109 | file_write, | 109 | file_write, |
| @@ -114,15 +114,16 @@ static BIO_METHOD methods_filep= | |||
| 114 | file_new, | 114 | file_new, |
| 115 | file_free, | 115 | file_free, |
| 116 | NULL, | 116 | NULL, |
| 117 | }; | 117 | }; |
| 118 | 118 | ||
| 119 | BIO *BIO_new_file(const char *filename, const char *mode) | 119 | BIO |
| 120 | { | 120 | *BIO_new_file(const char *filename, const char *mode) |
| 121 | { | ||
| 121 | BIO *ret; | 122 | BIO *ret; |
| 122 | FILE *file=NULL; | 123 | FILE *file = NULL; |
| 123 | 124 | ||
| 124 | #if defined(_WIN32) && defined(CP_UTF8) | 125 | #if defined(_WIN32) && defined(CP_UTF8) |
| 125 | int sz, len_0 = (int)strlen(filename)+1; | 126 | int sz, len_0 = (int)strlen(filename) + 1; |
| 126 | DWORD flags; | 127 | DWORD flags; |
| 127 | 128 | ||
| 128 | /* | 129 | /* |
| @@ -137,173 +138,171 @@ BIO *BIO_new_file(const char *filename, const char *mode) | |||
| 137 | * ERROR_NO_UNICODE_TRANSLATION, in which case we fall | 138 | * ERROR_NO_UNICODE_TRANSLATION, in which case we fall |
| 138 | * back to fopen... | 139 | * back to fopen... |
| 139 | */ | 140 | */ |
| 140 | if ((sz=MultiByteToWideChar(CP_UTF8,(flags=MB_ERR_INVALID_CHARS), | 141 | if ((sz = MultiByteToWideChar(CP_UTF8,(flags = MB_ERR_INVALID_CHARS), |
| 141 | filename,len_0,NULL,0))>0 || | 142 | filename, len_0, NULL, 0)) > 0 || |
| 142 | (GetLastError()==ERROR_INVALID_FLAGS && | 143 | (GetLastError() == ERROR_INVALID_FLAGS && |
| 143 | (sz=MultiByteToWideChar(CP_UTF8,(flags=0), | 144 | (sz = MultiByteToWideChar(CP_UTF8,(flags = 0), |
| 144 | filename,len_0,NULL,0))>0) | 145 | filename, len_0, NULL, 0)) > 0)) { |
| 145 | ) | ||
| 146 | { | ||
| 147 | WCHAR wmode[8]; | 146 | WCHAR wmode[8]; |
| 148 | WCHAR *wfilename = _alloca(sz*sizeof(WCHAR)); | 147 | WCHAR *wfilename = _alloca(sz*sizeof(WCHAR)); |
| 149 | 148 | ||
| 150 | if (MultiByteToWideChar(CP_UTF8,flags, | 149 | if (MultiByteToWideChar(CP_UTF8, flags, filename, len_0, |
| 151 | filename,len_0,wfilename,sz) && | 150 | wfilename, sz) && MultiByteToWideChar(CP_UTF8, 0, mode, |
| 152 | MultiByteToWideChar(CP_UTF8,0,mode,strlen(mode)+1, | 151 | strlen(mode) + 1, wmode, |
| 153 | wmode,sizeof(wmode)/sizeof(wmode[0])) && | 152 | sizeof(wmode) / sizeof(wmode[0])) && |
| 154 | (file=_wfopen(wfilename,wmode))==NULL && | 153 | (file = _wfopen(wfilename, wmode)) == NULL && |
| 155 | (errno==ENOENT || errno==EBADF) | 154 | (errno == ENOENT || errno == EBADF) |
| 156 | ) /* UTF-8 decode succeeded, but no file, filename | 155 | ) /* UTF - 8 decode succeeded, but no file, filename |
| 157 | * could still have been locale-ized... */ | 156 | * could still have been locale-ized... */ |
| 158 | file = fopen(filename,mode); | 157 | file = fopen(filename, mode); |
| 159 | } | 158 | } else if (GetLastError() == ERROR_NO_UNICODE_TRANSLATION) { |
| 160 | else if (GetLastError()==ERROR_NO_UNICODE_TRANSLATION) | 159 | file = fopen(filename, mode); |
| 161 | { | 160 | } |
| 162 | file = fopen(filename,mode); | ||
| 163 | } | ||
| 164 | #else | 161 | #else |
| 165 | file=fopen(filename,mode); | 162 | file = fopen(filename, mode); |
| 163 | |||
| 166 | #endif | 164 | #endif |
| 167 | if (file == NULL) | 165 | if (file == NULL) { |
| 168 | { | ||
| 169 | SYSerr(SYS_F_FOPEN, errno); | 166 | SYSerr(SYS_F_FOPEN, errno); |
| 170 | ERR_add_error_data(5,"fopen('",filename,"','",mode,"')"); | 167 | ERR_add_error_data(5, "fopen('", filename, "', '", mode, "')"); |
| 171 | if (errno == ENOENT) | 168 | if (errno == ENOENT) |
| 172 | BIOerr(BIO_F_BIO_NEW_FILE,BIO_R_NO_SUCH_FILE); | 169 | BIOerr(BIO_F_BIO_NEW_FILE, BIO_R_NO_SUCH_FILE); |
| 173 | else | 170 | else |
| 174 | BIOerr(BIO_F_BIO_NEW_FILE,ERR_R_SYS_LIB); | 171 | BIOerr(BIO_F_BIO_NEW_FILE, ERR_R_SYS_LIB); |
| 175 | return(NULL); | 172 | return (NULL); |
| 176 | } | 173 | } |
| 177 | if ((ret=BIO_new(BIO_s_file())) == NULL) | 174 | if ((ret = BIO_new(BIO_s_file())) == NULL) { |
| 178 | { | ||
| 179 | fclose(file); | 175 | fclose(file); |
| 180 | return(NULL); | 176 | return (NULL); |
| 181 | } | ||
| 182 | |||
| 183 | BIO_clear_flags(ret,BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */ | ||
| 184 | BIO_set_fp(ret,file,BIO_CLOSE); | ||
| 185 | return(ret); | ||
| 186 | } | 177 | } |
| 187 | 178 | ||
| 188 | BIO *BIO_new_fp(FILE *stream, int close_flag) | 179 | BIO_clear_flags(ret, BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */ |
| 189 | { | 180 | BIO_set_fp(ret, file, BIO_CLOSE); |
| 190 | BIO *ret; | 181 | return (ret); |
| 191 | 182 | } | |
| 192 | if ((ret=BIO_new(BIO_s_file())) == NULL) | ||
| 193 | return(NULL); | ||
| 194 | |||
| 195 | BIO_set_flags(ret,BIO_FLAGS_UPLINK); /* redundant, left for documentation puposes */ | ||
| 196 | BIO_set_fp(ret,stream,close_flag); | ||
| 197 | return(ret); | ||
| 198 | } | ||
| 199 | 183 | ||
| 200 | BIO_METHOD *BIO_s_file(void) | 184 | BIO |
| 201 | { | 185 | *BIO_new_fp(FILE *stream, int close_flag) |
| 202 | return(&methods_filep); | 186 | { |
| 203 | } | 187 | BIO *ret; |
| 204 | 188 | ||
| 205 | static int file_new(BIO *bi) | 189 | if ((ret = BIO_new(BIO_s_file())) == NULL) |
| 206 | { | 190 | return (NULL); |
| 207 | bi->init=0; | 191 | |
| 208 | bi->num=0; | 192 | BIO_set_flags(ret, BIO_FLAGS_UPLINK); /* redundant, left for documentation puposes */ |
| 209 | bi->ptr=NULL; | 193 | BIO_set_fp(ret, stream, close_flag); |
| 194 | return (ret); | ||
| 195 | } | ||
| 196 | |||
| 197 | BIO_METHOD | ||
| 198 | *BIO_s_file(void) | ||
| 199 | { | ||
| 200 | return (&methods_filep); | ||
| 201 | } | ||
| 202 | |||
| 203 | static int | ||
| 204 | file_new(BIO *bi) | ||
| 205 | { | ||
| 206 | bi->init = 0; | ||
| 207 | bi->num = 0; | ||
| 208 | bi->ptr = NULL; | ||
| 210 | bi->flags=BIO_FLAGS_UPLINK; /* default to UPLINK */ | 209 | bi->flags=BIO_FLAGS_UPLINK; /* default to UPLINK */ |
| 211 | return(1); | 210 | return (1); |
| 212 | } | 211 | } |
| 213 | 212 | ||
| 214 | static int file_free(BIO *a) | 213 | static int |
| 215 | { | 214 | file_free(BIO *a) |
| 216 | if (a == NULL) return(0); | 215 | { |
| 217 | if (a->shutdown) | 216 | if (a == NULL) |
| 218 | { | 217 | return (0); |
| 219 | if ((a->init) && (a->ptr != NULL)) | 218 | if (a->shutdown) { |
| 220 | { | 219 | if ((a->init) && (a->ptr != NULL)) { |
| 221 | if (a->flags&BIO_FLAGS_UPLINK) | 220 | if (a->flags&BIO_FLAGS_UPLINK) |
| 222 | UP_fclose (a->ptr); | 221 | UP_fclose (a->ptr); |
| 223 | else | 222 | else |
| 224 | fclose (a->ptr); | 223 | fclose (a->ptr); |
| 225 | a->ptr=NULL; | 224 | a->ptr = NULL; |
| 226 | a->flags=BIO_FLAGS_UPLINK; | 225 | a->flags = BIO_FLAGS_UPLINK; |
| 227 | } | ||
| 228 | a->init=0; | ||
| 229 | } | 226 | } |
| 230 | return(1); | 227 | a->init = 0; |
| 231 | } | 228 | } |
| 232 | 229 | return (1); | |
| 233 | static int file_read(BIO *b, char *out, int outl) | 230 | } |
| 234 | { | ||
| 235 | int ret=0; | ||
| 236 | 231 | ||
| 237 | if (b->init && (out != NULL)) | 232 | static int |
| 238 | { | 233 | file_read(BIO *b, char *out, int outl) |
| 234 | { | ||
| 235 | int ret = 0; | ||
| 236 | |||
| 237 | if (b->init && (out != NULL)) { | ||
| 239 | if (b->flags&BIO_FLAGS_UPLINK) | 238 | if (b->flags&BIO_FLAGS_UPLINK) |
| 240 | ret=UP_fread(out,1,(int)outl,b->ptr); | 239 | ret = UP_fread(out, 1,(int)outl, b->ptr); |
| 241 | else | 240 | else |
| 242 | ret=fread(out,1,(int)outl,(FILE *)b->ptr); | 241 | ret = fread(out, 1,(int)outl,(FILE *)b->ptr); |
| 243 | if(ret == 0 && (b->flags&BIO_FLAGS_UPLINK)?UP_ferror((FILE *)b->ptr):ferror((FILE *)b->ptr)) | 242 | if (ret == 0 && (b->flags & BIO_FLAGS_UPLINK) ? |
| 244 | { | 243 | UP_ferror((FILE *)b->ptr) : ferror((FILE *)b->ptr)) { |
| 245 | SYSerr(SYS_F_FREAD, errno); | 244 | SYSerr(SYS_F_FREAD, errno); |
| 246 | BIOerr(BIO_F_FILE_READ,ERR_R_SYS_LIB); | 245 | BIOerr(BIO_F_FILE_READ, ERR_R_SYS_LIB); |
| 247 | ret=-1; | 246 | ret = -1; |
| 248 | } | ||
| 249 | } | 247 | } |
| 250 | return(ret); | ||
| 251 | } | 248 | } |
| 249 | return (ret); | ||
| 250 | } | ||
| 252 | 251 | ||
| 253 | static int file_write(BIO *b, const char *in, int inl) | 252 | static int |
| 254 | { | 253 | file_write(BIO *b, const char *in, int inl) |
| 255 | int ret=0; | 254 | { |
| 255 | int ret = 0; | ||
| 256 | 256 | ||
| 257 | if (b->init && (in != NULL)) | 257 | if (b->init && (in != NULL)) { |
| 258 | { | ||
| 259 | if (b->flags&BIO_FLAGS_UPLINK) | 258 | if (b->flags&BIO_FLAGS_UPLINK) |
| 260 | ret=UP_fwrite(in,(int)inl,1,b->ptr); | 259 | ret = UP_fwrite(in,(int)inl, 1, b->ptr); |
| 261 | else | 260 | else |
| 262 | ret=fwrite(in,(int)inl,1,(FILE *)b->ptr); | 261 | ret = fwrite(in,(int)inl, 1,(FILE *)b->ptr); |
| 263 | if (ret) | 262 | if (ret) |
| 264 | ret=inl; | 263 | ret = inl; |
| 265 | /* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */ | 264 | /* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */ |
| 266 | /* according to Tim Hudson <tjh@cryptsoft.com>, the commented | 265 | /* according to Tim Hudson <tjh@cryptsoft.com>, the commented |
| 267 | * out version above can cause 'inl' write calls under | 266 | * out version above can cause 'inl' write calls under |
| 268 | * some stupid stdio implementations (VMS) */ | 267 | * some stupid stdio implementations (VMS) */ |
| 269 | } | ||
| 270 | return(ret); | ||
| 271 | } | 268 | } |
| 272 | 269 | return (ret); | |
| 273 | static long file_ctrl(BIO *b, int cmd, long num, void *ptr) | 270 | } |
| 274 | { | 271 | |
| 275 | long ret=1; | 272 | static long |
| 276 | FILE *fp=(FILE *)b->ptr; | 273 | file_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 274 | { | ||
| 275 | long ret = 1; | ||
| 276 | FILE *fp = (FILE *)b->ptr; | ||
| 277 | FILE **fpp; | 277 | FILE **fpp; |
| 278 | char p[4]; | 278 | char p[4]; |
| 279 | 279 | ||
| 280 | switch (cmd) | 280 | switch (cmd) { |
| 281 | { | ||
| 282 | case BIO_C_FILE_SEEK: | 281 | case BIO_C_FILE_SEEK: |
| 283 | case BIO_CTRL_RESET: | 282 | case BIO_CTRL_RESET: |
| 284 | if (b->flags&BIO_FLAGS_UPLINK) | 283 | if (b->flags&BIO_FLAGS_UPLINK) |
| 285 | ret=(long)UP_fseek(b->ptr,num,0); | 284 | ret = (long)UP_fseek(b->ptr, num, 0); |
| 286 | else | 285 | else |
| 287 | ret=(long)fseek(fp,num,0); | 286 | ret = (long)fseek(fp, num, 0); |
| 288 | break; | 287 | break; |
| 289 | case BIO_CTRL_EOF: | 288 | case BIO_CTRL_EOF: |
| 290 | if (b->flags&BIO_FLAGS_UPLINK) | 289 | if (b->flags&BIO_FLAGS_UPLINK) |
| 291 | ret=(long)UP_feof(fp); | 290 | ret = (long)UP_feof(fp); |
| 292 | else | 291 | else |
| 293 | ret=(long)feof(fp); | 292 | ret = (long)feof(fp); |
| 294 | break; | 293 | break; |
| 295 | case BIO_C_FILE_TELL: | 294 | case BIO_C_FILE_TELL: |
| 296 | case BIO_CTRL_INFO: | 295 | case BIO_CTRL_INFO: |
| 297 | if (b->flags&BIO_FLAGS_UPLINK) | 296 | if (b->flags&BIO_FLAGS_UPLINK) |
| 298 | ret=UP_ftell(b->ptr); | 297 | ret = UP_ftell(b->ptr); |
| 299 | else | 298 | else |
| 300 | ret=ftell(fp); | 299 | ret = ftell(fp); |
| 301 | break; | 300 | break; |
| 302 | case BIO_C_SET_FILE_PTR: | 301 | case BIO_C_SET_FILE_PTR: |
| 303 | file_free(b); | 302 | file_free(b); |
| 304 | b->shutdown=(int)num&BIO_CLOSE; | 303 | b->shutdown = (int)num&BIO_CLOSE; |
| 305 | b->ptr=ptr; | 304 | b->ptr = ptr; |
| 306 | b->init=1; | 305 | b->init = 1; |
| 307 | #if BIO_FLAGS_UPLINK!=0 | 306 | #if BIO_FLAGS_UPLINK!=0 |
| 308 | #if defined(__MINGW32__) && defined(__MSVCRT__) && !defined(_IOB_ENTRIES) | 307 | #if defined(__MINGW32__) && defined(__MSVCRT__) && !defined(_IOB_ENTRIES) |
| 309 | #define _IOB_ENTRIES 20 | 308 | #define _IOB_ENTRIES 20 |
| @@ -311,8 +310,8 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 311 | #if defined(_IOB_ENTRIES) | 310 | #if defined(_IOB_ENTRIES) |
| 312 | /* Safety net to catch purely internal BIO_set_fp calls */ | 311 | /* Safety net to catch purely internal BIO_set_fp calls */ |
| 313 | if ((size_t)ptr >= (size_t)stdin && | 312 | if ((size_t)ptr >= (size_t)stdin && |
| 314 | (size_t)ptr < (size_t)(stdin+_IOB_ENTRIES)) | 313 | (size_t)ptr < (size_t)(stdin + _IOB_ENTRIES)) |
| 315 | BIO_clear_flags(b,BIO_FLAGS_UPLINK); | 314 | BIO_clear_flags(b, BIO_FLAGS_UPLINK); |
| 316 | #endif | 315 | #endif |
| 317 | #endif | 316 | #endif |
| 318 | #ifdef UP_fsetmod | 317 | #ifdef UP_fsetmod |
| @@ -322,102 +321,94 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 322 | #endif | 321 | #endif |
| 323 | { | 322 | { |
| 324 | #if defined(OPENSSL_SYS_WINDOWS) | 323 | #if defined(OPENSSL_SYS_WINDOWS) |
| 325 | int fd = _fileno((FILE*)ptr); | 324 | int fd = _fileno((FILE*)ptr); |
| 326 | if (num & BIO_FP_TEXT) | 325 | if (num & BIO_FP_TEXT) |
| 327 | _setmode(fd,_O_TEXT); | 326 | _setmode(fd, _O_TEXT); |
| 328 | else | 327 | else |
| 329 | _setmode(fd,_O_BINARY); | 328 | _setmode(fd, _O_BINARY); |
| 330 | #elif defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_CLIB) | 329 | #elif defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_CLIB) |
| 331 | int fd = fileno((FILE*)ptr); | 330 | int fd = fileno((FILE*)ptr); |
| 332 | /* Under CLib there are differences in file modes */ | 331 | /* Under CLib there are differences in file modes */ |
| 333 | if (num & BIO_FP_TEXT) | 332 | if (num & BIO_FP_TEXT) |
| 334 | setmode(fd,O_TEXT); | 333 | setmode(fd, O_TEXT); |
| 335 | else | ||
| 336 | setmode(fd,O_BINARY); | ||
| 337 | #elif defined(OPENSSL_SYS_MSDOS) | ||
| 338 | int fd = fileno((FILE*)ptr); | ||
| 339 | /* Set correct text/binary mode */ | ||
| 340 | if (num & BIO_FP_TEXT) | ||
| 341 | _setmode(fd,_O_TEXT); | ||
| 342 | /* Dangerous to set stdin/stdout to raw (unless redirected) */ | ||
| 343 | else | ||
| 344 | { | ||
| 345 | if (fd == STDIN_FILENO || fd == STDOUT_FILENO) | ||
| 346 | { | ||
| 347 | if (isatty(fd) <= 0) | ||
| 348 | _setmode(fd,_O_BINARY); | ||
| 349 | } | ||
| 350 | else | 334 | else |
| 351 | _setmode(fd,_O_BINARY); | 335 | setmode(fd, O_BINARY); |
| 336 | #elif defined(OPENSSL_SYS_MSDOS) | ||
| 337 | int fd = fileno((FILE*)ptr); | ||
| 338 | /* Set correct text/binary mode */ | ||
| 339 | if (num & BIO_FP_TEXT) | ||
| 340 | _setmode(fd, _O_TEXT); | ||
| 341 | /* Dangerous to set stdin/stdout to raw (unless redirected) */ | ||
| 342 | else { | ||
| 343 | if (fd == STDIN_FILENO || fd == STDOUT_FILENO) { | ||
| 344 | if (isatty(fd) <= 0) | ||
| 345 | _setmode(fd, _O_BINARY); | ||
| 346 | } else | ||
| 347 | _setmode(fd, _O_BINARY); | ||
| 352 | } | 348 | } |
| 353 | #elif defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN) | 349 | #elif defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN) |
| 354 | int fd = fileno((FILE*)ptr); | 350 | int fd = fileno((FILE*)ptr); |
| 355 | if (num & BIO_FP_TEXT) | 351 | if (num & BIO_FP_TEXT) |
| 356 | setmode(fd, O_TEXT); | 352 | setmode(fd, O_TEXT); |
| 357 | else | 353 | else |
| 358 | setmode(fd, O_BINARY); | 354 | setmode(fd, O_BINARY); |
| 359 | #endif | 355 | #endif |
| 360 | } | 356 | } |
| 361 | break; | 357 | break; |
| 362 | case BIO_C_SET_FILENAME: | 358 | case BIO_C_SET_FILENAME: |
| 363 | file_free(b); | 359 | file_free(b); |
| 364 | b->shutdown=(int)num&BIO_CLOSE; | 360 | b->shutdown = (int)num&BIO_CLOSE; |
| 365 | if (num & BIO_FP_APPEND) | 361 | if (num & BIO_FP_APPEND) { |
| 366 | { | ||
| 367 | if (num & BIO_FP_READ) | 362 | if (num & BIO_FP_READ) |
| 368 | BUF_strlcpy(p,"a+",sizeof p); | 363 | BUF_strlcpy(p, "a+", sizeof p); |
| 369 | else BUF_strlcpy(p,"a",sizeof p); | 364 | else BUF_strlcpy(p, "a", sizeof p); |
| 370 | } | 365 | } else if ((num & BIO_FP_READ) && (num & BIO_FP_WRITE)) |
| 371 | else if ((num & BIO_FP_READ) && (num & BIO_FP_WRITE)) | 366 | BUF_strlcpy(p, "r+", sizeof p); |
| 372 | BUF_strlcpy(p,"r+",sizeof p); | ||
| 373 | else if (num & BIO_FP_WRITE) | 367 | else if (num & BIO_FP_WRITE) |
| 374 | BUF_strlcpy(p,"w",sizeof p); | 368 | BUF_strlcpy(p, "w", sizeof p); |
| 375 | else if (num & BIO_FP_READ) | 369 | else if (num & BIO_FP_READ) |
| 376 | BUF_strlcpy(p,"r",sizeof p); | 370 | BUF_strlcpy(p, "r", sizeof p); |
| 377 | else | 371 | else { |
| 378 | { | 372 | BIOerr(BIO_F_FILE_CTRL, BIO_R_BAD_FOPEN_MODE); |
| 379 | BIOerr(BIO_F_FILE_CTRL,BIO_R_BAD_FOPEN_MODE); | 373 | ret = 0; |
| 380 | ret=0; | ||
| 381 | break; | 374 | break; |
| 382 | } | 375 | } |
| 383 | #if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN) | 376 | #if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN) |
| 384 | if (!(num & BIO_FP_TEXT)) | 377 | if (!(num & BIO_FP_TEXT)) |
| 385 | strcat(p,"b"); | 378 | strcat(p, "b"); |
| 386 | else | 379 | else |
| 387 | strcat(p,"t"); | 380 | strcat(p, "t"); |
| 388 | #endif | 381 | #endif |
| 389 | #if defined(OPENSSL_SYS_NETWARE) | 382 | #if defined(OPENSSL_SYS_NETWARE) |
| 390 | if (!(num & BIO_FP_TEXT)) | 383 | if (!(num & BIO_FP_TEXT)) |
| 391 | strcat(p,"b"); | 384 | strcat(p, "b"); |
| 392 | else | 385 | else |
| 393 | strcat(p,"t"); | 386 | strcat(p, "t"); |
| 394 | #endif | 387 | #endif |
| 395 | fp=fopen(ptr,p); | 388 | fp = fopen(ptr, p); |
| 396 | if (fp == NULL) | 389 | if (fp == NULL) { |
| 397 | { | ||
| 398 | SYSerr(SYS_F_FOPEN, errno); | 390 | SYSerr(SYS_F_FOPEN, errno); |
| 399 | ERR_add_error_data(5,"fopen('",ptr,"','",p,"')"); | 391 | ERR_add_error_data(5, "fopen('", ptr, "', '", p, "')"); |
| 400 | BIOerr(BIO_F_FILE_CTRL,ERR_R_SYS_LIB); | 392 | BIOerr(BIO_F_FILE_CTRL, ERR_R_SYS_LIB); |
| 401 | ret=0; | 393 | ret = 0; |
| 402 | break; | 394 | break; |
| 403 | } | 395 | } |
| 404 | b->ptr=fp; | 396 | b->ptr = fp; |
| 405 | b->init=1; | 397 | b->init = 1; |
| 406 | BIO_clear_flags(b,BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */ | 398 | BIO_clear_flags(b, BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */ |
| 407 | break; | 399 | break; |
| 408 | case BIO_C_GET_FILE_PTR: | 400 | case BIO_C_GET_FILE_PTR: |
| 409 | /* the ptr parameter is actually a FILE ** in this case. */ | 401 | /* the ptr parameter is actually a FILE ** in this case. */ |
| 410 | if (ptr != NULL) | 402 | if (ptr != NULL) { |
| 411 | { | 403 | fpp = (FILE **)ptr; |
| 412 | fpp=(FILE **)ptr; | 404 | *fpp = (FILE *)b->ptr; |
| 413 | *fpp=(FILE *)b->ptr; | 405 | } |
| 414 | } | ||
| 415 | break; | 406 | break; |
| 416 | case BIO_CTRL_GET_CLOSE: | 407 | case BIO_CTRL_GET_CLOSE: |
| 417 | ret=(long)b->shutdown; | 408 | ret = (long)b->shutdown; |
| 418 | break; | 409 | break; |
| 419 | case BIO_CTRL_SET_CLOSE: | 410 | case BIO_CTRL_SET_CLOSE: |
| 420 | b->shutdown=(int)num; | 411 | b->shutdown = (int)num; |
| 421 | break; | 412 | break; |
| 422 | case BIO_CTRL_FLUSH: | 413 | case BIO_CTRL_FLUSH: |
| 423 | if (b->flags&BIO_FLAGS_UPLINK) | 414 | if (b->flags&BIO_FLAGS_UPLINK) |
| @@ -426,7 +417,7 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 426 | fflush((FILE *)b->ptr); | 417 | fflush((FILE *)b->ptr); |
| 427 | break; | 418 | break; |
| 428 | case BIO_CTRL_DUP: | 419 | case BIO_CTRL_DUP: |
| 429 | ret=1; | 420 | ret = 1; |
| 430 | break; | 421 | break; |
| 431 | 422 | ||
| 432 | case BIO_CTRL_WPENDING: | 423 | case BIO_CTRL_WPENDING: |
| @@ -434,44 +425,41 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 434 | case BIO_CTRL_PUSH: | 425 | case BIO_CTRL_PUSH: |
| 435 | case BIO_CTRL_POP: | 426 | case BIO_CTRL_POP: |
| 436 | default: | 427 | default: |
| 437 | ret=0; | 428 | ret = 0; |
| 438 | break; | 429 | break; |
| 439 | } | ||
| 440 | return(ret); | ||
| 441 | } | 430 | } |
| 431 | return (ret); | ||
| 432 | } | ||
| 442 | 433 | ||
| 443 | static int file_gets(BIO *bp, char *buf, int size) | 434 | static int |
| 444 | { | 435 | file_gets(BIO *bp, char *buf, int size) |
| 445 | int ret=0; | 436 | { |
| 437 | int ret = 0; | ||
| 446 | 438 | ||
| 447 | buf[0]='\0'; | 439 | buf[0] = '\0'; |
| 448 | if (bp->flags&BIO_FLAGS_UPLINK) | 440 | if (bp->flags&BIO_FLAGS_UPLINK) { |
| 449 | { | 441 | if (!UP_fgets(buf, size, bp->ptr)) |
| 450 | if (!UP_fgets(buf,size,bp->ptr)) | ||
| 451 | goto err; | 442 | goto err; |
| 452 | } | 443 | } else { |
| 453 | else | 444 | if (!fgets(buf, size,(FILE *)bp->ptr)) |
| 454 | { | ||
| 455 | if (!fgets(buf,size,(FILE *)bp->ptr)) | ||
| 456 | goto err; | 445 | goto err; |
| 457 | } | ||
| 458 | if (buf[0] != '\0') | ||
| 459 | ret=strlen(buf); | ||
| 460 | err: | ||
| 461 | return(ret); | ||
| 462 | } | 446 | } |
| 447 | if (buf[0] != '\0') | ||
| 448 | ret = strlen(buf); | ||
| 449 | err: | ||
| 450 | return (ret); | ||
| 451 | } | ||
| 463 | 452 | ||
| 464 | static int file_puts(BIO *bp, const char *str) | 453 | static int |
| 465 | { | 454 | file_puts(BIO *bp, const char *str) |
| 466 | int n,ret; | 455 | { |
| 456 | int n, ret; | ||
| 467 | 457 | ||
| 468 | n=strlen(str); | 458 | n = strlen(str); |
| 469 | ret=file_write(bp,str,n); | 459 | ret = file_write(bp, str, n); |
| 470 | return(ret); | 460 | return (ret); |
| 471 | } | 461 | } |
| 472 | 462 | ||
| 473 | #endif /* OPENSSL_NO_STDIO */ | 463 | #endif /* OPENSSL_NO_STDIO */ |
| 474 | 464 | ||
| 475 | #endif /* HEADER_BSS_FILE_C */ | 465 | #endif /* HEADER_BSS_FILE_C */ |
| 476 | |||
| 477 | |||
diff --git a/src/lib/libcrypto/bio/bss_log.c b/src/lib/libcrypto/bio/bss_log.c index 1cc413a916..9225af4df2 100644 --- a/src/lib/libcrypto/bio/bss_log.c +++ b/src/lib/libcrypto/bio/bss_log.c | |||
| @@ -80,7 +80,7 @@ | |||
| 80 | # if __INITIAL_POINTER_SIZE == 64 | 80 | # if __INITIAL_POINTER_SIZE == 64 |
| 81 | # pragma pointer_size save | 81 | # pragma pointer_size save |
| 82 | # pragma pointer_size 32 | 82 | # pragma pointer_size 32 |
| 83 | void * _malloc32 (__size_t); | 83 | void * _malloc32 (__size_t); |
| 84 | # pragma pointer_size restore | 84 | # pragma pointer_size restore |
| 85 | # endif /* __INITIAL_POINTER_SIZE == 64 */ | 85 | # endif /* __INITIAL_POINTER_SIZE == 64 */ |
| 86 | # endif /* __INITIAL_POINTER_SIZE && defined _ANSI_C_SOURCE */ | 86 | # endif /* __INITIAL_POINTER_SIZE && defined _ANSI_C_SOURCE */ |
| @@ -131,9 +131,8 @@ static void xopenlog(BIO* bp, char* name, int level); | |||
| 131 | static void xsyslog(BIO* bp, int priority, const char* string); | 131 | static void xsyslog(BIO* bp, int priority, const char* string); |
| 132 | static void xcloselog(BIO* bp); | 132 | static void xcloselog(BIO* bp); |
| 133 | 133 | ||
| 134 | static BIO_METHOD methods_slg= | 134 | static BIO_METHOD methods_slg = { |
| 135 | { | 135 | BIO_TYPE_MEM, "syslog", |
| 136 | BIO_TYPE_MEM,"syslog", | ||
| 137 | slg_write, | 136 | slg_write, |
| 138 | NULL, | 137 | NULL, |
| 139 | slg_puts, | 138 | slg_puts, |
| @@ -142,43 +141,46 @@ static BIO_METHOD methods_slg= | |||
| 142 | slg_new, | 141 | slg_new, |
| 143 | slg_free, | 142 | slg_free, |
| 144 | NULL, | 143 | NULL, |
| 145 | }; | 144 | }; |
| 146 | 145 | ||
| 147 | BIO_METHOD *BIO_s_log(void) | 146 | BIO_METHOD |
| 148 | { | 147 | *BIO_s_log(void) |
| 149 | return(&methods_slg); | 148 | { |
| 150 | } | 149 | return (&methods_slg); |
| 150 | } | ||
| 151 | 151 | ||
| 152 | static int slg_new(BIO *bi) | 152 | static int |
| 153 | { | 153 | slg_new(BIO *bi) |
| 154 | bi->init=1; | 154 | { |
| 155 | bi->num=0; | 155 | bi->init = 1; |
| 156 | bi->ptr=NULL; | 156 | bi->num = 0; |
| 157 | bi->ptr = NULL; | ||
| 157 | xopenlog(bi, "application", LOG_DAEMON); | 158 | xopenlog(bi, "application", LOG_DAEMON); |
| 158 | return(1); | 159 | return (1); |
| 159 | } | 160 | } |
| 160 | 161 | ||
| 161 | static int slg_free(BIO *a) | 162 | static int |
| 162 | { | 163 | slg_free(BIO *a) |
| 163 | if (a == NULL) return(0); | 164 | { |
| 165 | if (a == NULL) | ||
| 166 | return (0); | ||
| 164 | xcloselog(a); | 167 | xcloselog(a); |
| 165 | return(1); | 168 | return (1); |
| 166 | } | 169 | } |
| 167 | 170 | ||
| 168 | static int slg_write(BIO *b, const char *in, int inl) | 171 | static int |
| 169 | { | 172 | slg_write(BIO *b, const char *in, int inl) |
| 170 | int ret= inl; | 173 | { |
| 174 | int ret = inl; | ||
| 171 | char* buf; | 175 | char* buf; |
| 172 | char* pp; | 176 | char* pp; |
| 173 | int priority, i; | 177 | int priority, i; |
| 174 | static const struct | 178 | static const struct { |
| 175 | { | ||
| 176 | int strl; | 179 | int strl; |
| 177 | char str[10]; | 180 | char str[10]; |
| 178 | int log_level; | 181 | int log_level; |
| 179 | } | 182 | } |
| 180 | mapping[] = | 183 | mapping[] = { |
| 181 | { | ||
| 182 | { 6, "PANIC ", LOG_EMERG }, | 184 | { 6, "PANIC ", LOG_EMERG }, |
| 183 | { 6, "EMERG ", LOG_EMERG }, | 185 | { 6, "EMERG ", LOG_EMERG }, |
| 184 | { 4, "EMR ", LOG_EMERG }, | 186 | { 4, "EMR ", LOG_EMERG }, |
| @@ -199,69 +201,72 @@ static int slg_write(BIO *b, const char *in, int inl) | |||
| 199 | { 6, "DEBUG ", LOG_DEBUG }, | 201 | { 6, "DEBUG ", LOG_DEBUG }, |
| 200 | { 4, "DBG ", LOG_DEBUG }, | 202 | { 4, "DBG ", LOG_DEBUG }, |
| 201 | { 0, "", LOG_ERR } /* The default */ | 203 | { 0, "", LOG_ERR } /* The default */ |
| 202 | }; | 204 | }; |
| 203 | 205 | ||
| 204 | if((buf= (char *)OPENSSL_malloc(inl+ 1)) == NULL){ | 206 | if ((buf = (char *)OPENSSL_malloc(inl + 1)) == NULL) { |
| 205 | return(0); | 207 | return (0); |
| 206 | } | 208 | } |
| 207 | strncpy(buf, in, inl); | 209 | strncpy(buf, in, inl); |
| 208 | buf[inl]= '\0'; | 210 | buf[inl] = '\0'; |
| 209 | 211 | ||
| 210 | i = 0; | 212 | i = 0; |
| 211 | while(strncmp(buf, mapping[i].str, mapping[i].strl) != 0) i++; | 213 | while (strncmp(buf, mapping[i].str, mapping[i].strl) != 0) |
| 214 | i++; | ||
| 212 | priority = mapping[i].log_level; | 215 | priority = mapping[i].log_level; |
| 213 | pp = buf + mapping[i].strl; | 216 | pp = buf + mapping[i].strl; |
| 214 | 217 | ||
| 215 | xsyslog(b, priority, pp); | 218 | xsyslog(b, priority, pp); |
| 216 | 219 | ||
| 217 | OPENSSL_free(buf); | 220 | OPENSSL_free(buf); |
| 218 | return(ret); | 221 | return (ret); |
| 219 | } | 222 | } |
| 220 | 223 | ||
| 221 | static long slg_ctrl(BIO *b, int cmd, long num, void *ptr) | 224 | static long |
| 222 | { | 225 | slg_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 223 | switch (cmd) | 226 | { |
| 224 | { | 227 | switch (cmd) { |
| 225 | case BIO_CTRL_SET: | 228 | case BIO_CTRL_SET: |
| 226 | xcloselog(b); | 229 | xcloselog(b); |
| 227 | xopenlog(b, ptr, num); | 230 | xopenlog(b, ptr, num); |
| 228 | break; | 231 | break; |
| 229 | default: | 232 | default: |
| 230 | break; | 233 | break; |
| 231 | } | ||
| 232 | return(0); | ||
| 233 | } | 234 | } |
| 235 | return (0); | ||
| 236 | } | ||
| 234 | 237 | ||
| 235 | static int slg_puts(BIO *bp, const char *str) | 238 | static int |
| 236 | { | 239 | slg_puts(BIO *bp, const char *str) |
| 237 | int n,ret; | 240 | { |
| 241 | int n, ret; | ||
| 238 | 242 | ||
| 239 | n=strlen(str); | 243 | n = strlen(str); |
| 240 | ret=slg_write(bp,str,n); | 244 | ret = slg_write(bp, str, n); |
| 241 | return(ret); | 245 | return (ret); |
| 242 | } | 246 | } |
| 243 | 247 | ||
| 244 | #if defined(OPENSSL_SYS_WIN32) | 248 | #if defined(OPENSSL_SYS_WIN32) |
| 245 | 249 | ||
| 246 | static void xopenlog(BIO* bp, char* name, int level) | 250 | static void |
| 251 | xopenlog(BIO* bp, char* name, int level) | ||
| 247 | { | 252 | { |
| 248 | if (check_winnt()) | 253 | if (check_winnt()) |
| 249 | bp->ptr = RegisterEventSourceA(NULL,name); | 254 | bp->ptr = RegisterEventSourceA(NULL, name); |
| 250 | else | 255 | else |
| 251 | bp->ptr = NULL; | 256 | bp->ptr = NULL; |
| 252 | } | 257 | } |
| 253 | 258 | ||
| 254 | static void xsyslog(BIO *bp, int priority, const char *string) | 259 | static void |
| 260 | xsyslog(BIO *bp, int priority, const char *string) | ||
| 255 | { | 261 | { |
| 256 | LPCSTR lpszStrings[2]; | 262 | LPCSTR lpszStrings[2]; |
| 257 | WORD evtype= EVENTLOG_ERROR_TYPE; | 263 | WORD evtype = EVENTLOG_ERROR_TYPE; |
| 258 | char pidbuf[DECIMAL_SIZE(DWORD)+4]; | 264 | char pidbuf[DECIMAL_SIZE(DWORD) + 4]; |
| 259 | 265 | ||
| 260 | if (bp->ptr == NULL) | 266 | if (bp->ptr == NULL) |
| 261 | return; | 267 | return; |
| 262 | 268 | ||
| 263 | switch (priority) | 269 | switch (priority) { |
| 264 | { | ||
| 265 | case LOG_EMERG: | 270 | case LOG_EMERG: |
| 266 | case LOG_ALERT: | 271 | case LOG_ALERT: |
| 267 | case LOG_CRIT: | 272 | case LOG_CRIT: |
| @@ -280,33 +285,37 @@ static void xsyslog(BIO *bp, int priority, const char *string) | |||
| 280 | as error anyway. */ | 285 | as error anyway. */ |
| 281 | evtype = EVENTLOG_ERROR_TYPE; | 286 | evtype = EVENTLOG_ERROR_TYPE; |
| 282 | break; | 287 | break; |
| 283 | } | 288 | } |
| 284 | 289 | ||
| 285 | sprintf(pidbuf, "[%u] ", GetCurrentProcessId()); | 290 | sprintf(pidbuf, "[%u] ", GetCurrentProcessId()); |
| 286 | lpszStrings[0] = pidbuf; | 291 | lpszStrings[0] = pidbuf; |
| 287 | lpszStrings[1] = string; | 292 | lpszStrings[1] = string; |
| 288 | 293 | ||
| 289 | ReportEventA(bp->ptr, evtype, 0, 1024, NULL, 2, 0, | 294 | ReportEventA(bp->ptr, evtype, 0, 1024, NULL, 2, 0, |
| 290 | lpszStrings, NULL); | 295 | lpszStrings, NULL); |
| 291 | } | 296 | } |
| 292 | 297 | ||
| 293 | static void xcloselog(BIO* bp) | 298 | static void |
| 299 | xcloselog(BIO* bp) | ||
| 294 | { | 300 | { |
| 295 | if(bp->ptr) | 301 | if (bp->ptr) |
| 296 | DeregisterEventSource((HANDLE)(bp->ptr)); | 302 | DeregisterEventSource((HANDLE)(bp->ptr)); |
| 297 | bp->ptr= NULL; | 303 | bp->ptr = NULL; |
| 298 | } | 304 | } |
| 299 | 305 | ||
| 300 | #elif defined(OPENSSL_SYS_VMS) | 306 | #elif defined(OPENSSL_SYS_VMS) |
| 301 | 307 | ||
| 302 | static int VMS_OPC_target = LOG_DAEMON; | 308 | static int VMS_OPC_target = LOG_DAEMON; |
| 303 | 309 | ||
| 304 | static void xopenlog(BIO* bp, char* name, int level) | 310 | static void |
| 311 | xopenlog(BIO* bp, char* name, int level) | ||
| 305 | { | 312 | { |
| 306 | VMS_OPC_target = level; | 313 | VMS_OPC_target = level; |
| 314 | |||
| 307 | } | 315 | } |
| 308 | 316 | ||
| 309 | static void xsyslog(BIO *bp, int priority, const char *string) | 317 | static void |
| 318 | xsyslog(BIO *bp, int priority, const char *string) | ||
| 310 | { | 319 | { |
| 311 | struct dsc$descriptor_s opc_dsc; | 320 | struct dsc$descriptor_s opc_dsc; |
| 312 | 321 | ||
| @@ -329,21 +338,28 @@ static void xsyslog(BIO *bp, int priority, const char *string) | |||
| 329 | 338 | ||
| 330 | char buf[10240]; | 339 | char buf[10240]; |
| 331 | unsigned int len; | 340 | unsigned int len; |
| 332 | struct dsc$descriptor_s buf_dsc; | 341 | struct dsc$descriptor_s buf_dsc; |
| 333 | $DESCRIPTOR(fao_cmd, "!AZ: !AZ"); | 342 | $DESCRIPTOR(fao_cmd, "!AZ: !AZ"); |
| 334 | char *priority_tag; | 343 | char *priority_tag; |
| 335 | 344 | ||
| 336 | switch (priority) | 345 | switch (priority) { |
| 337 | { | 346 | case LOG_EMERG: |
| 338 | case LOG_EMERG: priority_tag = "Emergency"; break; | 347 | priority_tag = "Emergency"; break; |
| 339 | case LOG_ALERT: priority_tag = "Alert"; break; | 348 | case LOG_ALERT: |
| 340 | case LOG_CRIT: priority_tag = "Critical"; break; | 349 | priority_tag = "Alert"; break; |
| 341 | case LOG_ERR: priority_tag = "Error"; break; | 350 | case LOG_CRIT: |
| 342 | case LOG_WARNING: priority_tag = "Warning"; break; | 351 | priority_tag = "Critical"; break; |
| 343 | case LOG_NOTICE: priority_tag = "Notice"; break; | 352 | case LOG_ERR: |
| 344 | case LOG_INFO: priority_tag = "Info"; break; | 353 | priority_tag = "Error"; break; |
| 345 | case LOG_DEBUG: priority_tag = "DEBUG"; break; | 354 | case LOG_WARNING: |
| 346 | } | 355 | priority_tag = "Warning"; break; |
| 356 | case LOG_NOTICE: | ||
| 357 | priority_tag = "Notice"; break; | ||
| 358 | case LOG_INFO: | ||
| 359 | priority_tag = "Info"; break; | ||
| 360 | case LOG_DEBUG: | ||
| 361 | priority_tag = "DEBUG"; break; | ||
| 362 | } | ||
| 347 | 363 | ||
| 348 | buf_dsc.dsc$b_dtype = DSC$K_DTYPE_T; | 364 | buf_dsc.dsc$b_dtype = DSC$K_DTYPE_T; |
| 349 | buf_dsc.dsc$b_class = DSC$K_CLASS_S; | 365 | buf_dsc.dsc$b_class = DSC$K_CLASS_S; |
| @@ -353,7 +369,7 @@ static void xsyslog(BIO *bp, int priority, const char *string) | |||
| 353 | lib$sys_fao(&fao_cmd, &len, &buf_dsc, priority_tag, string); | 369 | lib$sys_fao(&fao_cmd, &len, &buf_dsc, priority_tag, string); |
| 354 | 370 | ||
| 355 | /* We know there's an 8-byte header. That's documented. */ | 371 | /* We know there's an 8-byte header. That's documented. */ |
| 356 | opcdef_p = OPCDEF_MALLOC( 8+ len); | 372 | opcdef_p = OPCDEF_MALLOC( 8 + len); |
| 357 | opcdef_p->opc$b_ms_type = OPC$_RQ_RQST; | 373 | opcdef_p->opc$b_ms_type = OPC$_RQ_RQST; |
| 358 | memcpy(opcdef_p->opc$z_ms_target_classes, &VMS_OPC_target, 3); | 374 | memcpy(opcdef_p->opc$z_ms_target_classes, &VMS_OPC_target, 3); |
| 359 | opcdef_p->opc$l_ms_rqstid = 0; | 375 | opcdef_p->opc$l_ms_rqstid = 0; |
| @@ -369,13 +385,15 @@ static void xsyslog(BIO *bp, int priority, const char *string) | |||
| 369 | OPENSSL_free(opcdef_p); | 385 | OPENSSL_free(opcdef_p); |
| 370 | } | 386 | } |
| 371 | 387 | ||
| 372 | static void xcloselog(BIO* bp) | 388 | static void |
| 389 | xcloselog(BIO* bp) | ||
| 373 | { | 390 | { |
| 374 | } | 391 | } |
| 375 | 392 | ||
| 376 | #else /* Unix/Watt32 */ | 393 | #else /* Unix/Watt32 */ |
| 377 | 394 | ||
| 378 | static void xopenlog(BIO* bp, char* name, int level) | 395 | static void |
| 396 | xopenlog(BIO* bp, char* name, int level) | ||
| 379 | { | 397 | { |
| 380 | #ifdef WATT32 /* djgpp/DOS */ | 398 | #ifdef WATT32 /* djgpp/DOS */ |
| 381 | openlog(name, LOG_PID|LOG_CONS|LOG_NDELAY, level); | 399 | openlog(name, LOG_PID|LOG_CONS|LOG_NDELAY, level); |
| @@ -384,12 +402,14 @@ static void xopenlog(BIO* bp, char* name, int level) | |||
| 384 | #endif | 402 | #endif |
| 385 | } | 403 | } |
| 386 | 404 | ||
| 387 | static void xsyslog(BIO *bp, int priority, const char *string) | 405 | static void |
| 406 | xsyslog(BIO *bp, int priority, const char *string) | ||
| 388 | { | 407 | { |
| 389 | syslog(priority, "%s", string); | 408 | syslog(priority, "%s", string); |
| 390 | } | 409 | } |
| 391 | 410 | ||
| 392 | static void xcloselog(BIO* bp) | 411 | static void |
| 412 | xcloselog(BIO* bp) | ||
| 393 | { | 413 | { |
| 394 | closelog(); | 414 | closelog(); |
| 395 | } | 415 | } |
diff --git a/src/lib/libcrypto/bio/bss_mem.c b/src/lib/libcrypto/bio/bss_mem.c index 37d4194e4b..a5192202bd 100644 --- a/src/lib/libcrypto/bio/bss_mem.c +++ b/src/lib/libcrypto/bio/bss_mem.c | |||
| @@ -68,8 +68,8 @@ static int mem_gets(BIO *h, char *str, int size); | |||
| 68 | static long mem_ctrl(BIO *h, int cmd, long arg1, void *arg2); | 68 | static long mem_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 69 | static int mem_new(BIO *h); | 69 | static int mem_new(BIO *h); |
| 70 | static int mem_free(BIO *data); | 70 | static int mem_free(BIO *data); |
| 71 | static BIO_METHOD mem_method= | 71 | |
| 72 | { | 72 | static BIO_METHOD mem_method = { |
| 73 | BIO_TYPE_MEM, | 73 | BIO_TYPE_MEM, |
| 74 | "memory buffer", | 74 | "memory buffer", |
| 75 | mem_write, | 75 | mem_write, |
| @@ -80,28 +80,31 @@ static BIO_METHOD mem_method= | |||
| 80 | mem_new, | 80 | mem_new, |
| 81 | mem_free, | 81 | mem_free, |
| 82 | NULL, | 82 | NULL, |
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | /* bio->num is used to hold the value to return on 'empty', if it is | 85 | /* bio->num is used to hold the value to return on 'empty', if it is |
| 86 | * 0, should_retry is not set */ | 86 | * 0, should_retry is not set */ |
| 87 | 87 | ||
| 88 | BIO_METHOD *BIO_s_mem(void) | 88 | BIO_METHOD |
| 89 | { | 89 | *BIO_s_mem(void) |
| 90 | return(&mem_method); | 90 | { |
| 91 | } | 91 | return (&mem_method); |
| 92 | } | ||
| 92 | 93 | ||
| 93 | BIO *BIO_new_mem_buf(void *buf, int len) | 94 | BIO |
| 95 | *BIO_new_mem_buf(void *buf, int len) | ||
| 94 | { | 96 | { |
| 95 | BIO *ret; | 97 | BIO *ret; |
| 96 | BUF_MEM *b; | 98 | BUF_MEM *b; |
| 97 | size_t sz; | 99 | size_t sz; |
| 98 | 100 | ||
| 99 | if (!buf) { | 101 | if (!buf) { |
| 100 | BIOerr(BIO_F_BIO_NEW_MEM_BUF,BIO_R_NULL_PARAMETER); | 102 | BIOerr(BIO_F_BIO_NEW_MEM_BUF, BIO_R_NULL_PARAMETER); |
| 101 | return NULL; | 103 | return NULL; |
| 102 | } | 104 | } |
| 103 | sz = (len<0) ? strlen(buf) : (size_t)len; | 105 | sz = (len < 0) ? strlen(buf) : (size_t)len; |
| 104 | if(!(ret = BIO_new(BIO_s_mem())) ) return NULL; | 106 | if (!(ret = BIO_new(BIO_s_mem()))) |
| 107 | return NULL; | ||
| 105 | b = (BUF_MEM *)ret->ptr; | 108 | b = (BUF_MEM *)ret->ptr; |
| 106 | b->data = buf; | 109 | b->data = buf; |
| 107 | b->length = sz; | 110 | b->length = sz; |
| @@ -112,208 +115,205 @@ BIO *BIO_new_mem_buf(void *buf, int len) | |||
| 112 | return ret; | 115 | return ret; |
| 113 | } | 116 | } |
| 114 | 117 | ||
| 115 | static int mem_new(BIO *bi) | 118 | static int |
| 116 | { | 119 | mem_new(BIO *bi) |
| 120 | { | ||
| 117 | BUF_MEM *b; | 121 | BUF_MEM *b; |
| 118 | 122 | ||
| 119 | if ((b=BUF_MEM_new()) == NULL) | 123 | if ((b = BUF_MEM_new()) == NULL) |
| 120 | return(0); | 124 | return (0); |
| 121 | bi->shutdown=1; | 125 | bi->shutdown = 1; |
| 122 | bi->init=1; | 126 | bi->init = 1; |
| 123 | bi->num= -1; | 127 | bi->num = -1; |
| 124 | bi->ptr=(char *)b; | 128 | bi->ptr = (char *)b; |
| 125 | return(1); | 129 | return (1); |
| 126 | } | 130 | } |
| 127 | 131 | ||
| 128 | static int mem_free(BIO *a) | 132 | static int |
| 129 | { | 133 | mem_free(BIO *a) |
| 130 | if (a == NULL) return(0); | 134 | { |
| 131 | if (a->shutdown) | 135 | if (a == NULL) |
| 132 | { | 136 | return (0); |
| 133 | if ((a->init) && (a->ptr != NULL)) | 137 | if (a->shutdown) { |
| 134 | { | 138 | if ((a->init) && (a->ptr != NULL)) { |
| 135 | BUF_MEM *b; | 139 | BUF_MEM *b; |
| 136 | b = (BUF_MEM *)a->ptr; | 140 | b = (BUF_MEM *)a->ptr; |
| 137 | if(a->flags & BIO_FLAGS_MEM_RDONLY) b->data = NULL; | 141 | if (a->flags & BIO_FLAGS_MEM_RDONLY) |
| 138 | BUF_MEM_free(b); | 142 | b->data = NULL; |
| 139 | a->ptr=NULL; | 143 | BUF_MEM_free(b); |
| 140 | } | 144 | a->ptr = NULL; |
| 141 | } | 145 | } |
| 142 | return(1); | ||
| 143 | } | 146 | } |
| 144 | 147 | return (1); | |
| 145 | static int mem_read(BIO *b, char *out, int outl) | 148 | } |
| 146 | { | 149 | |
| 147 | int ret= -1; | 150 | static int |
| 151 | mem_read(BIO *b, char *out, int outl) | ||
| 152 | { | ||
| 153 | int ret = -1; | ||
| 148 | BUF_MEM *bm; | 154 | BUF_MEM *bm; |
| 149 | 155 | ||
| 150 | bm=(BUF_MEM *)b->ptr; | 156 | bm = (BUF_MEM *)b->ptr; |
| 151 | BIO_clear_retry_flags(b); | 157 | BIO_clear_retry_flags(b); |
| 152 | ret=(outl >=0 && (size_t)outl > bm->length)?(int)bm->length:outl; | 158 | ret = (outl >=0 && (size_t)outl > bm->length) ? (int)bm->length : outl; |
| 153 | if ((out != NULL) && (ret > 0)) { | 159 | if ((out != NULL) && (ret > 0)) { |
| 154 | memcpy(out,bm->data,ret); | 160 | memcpy(out, bm->data, ret); |
| 155 | bm->length-=ret; | 161 | bm->length -= ret; |
| 156 | if(b->flags & BIO_FLAGS_MEM_RDONLY) bm->data += ret; | 162 | if (b->flags & BIO_FLAGS_MEM_RDONLY) |
| 163 | bm->data += ret; | ||
| 157 | else { | 164 | else { |
| 158 | memmove(&(bm->data[0]),&(bm->data[ret]),bm->length); | 165 | memmove(&(bm->data[0]), &(bm->data[ret]), bm->length); |
| 159 | } | 166 | } |
| 160 | } else if (bm->length == 0) | 167 | } else if (bm->length == 0) { |
| 161 | { | ||
| 162 | ret = b->num; | 168 | ret = b->num; |
| 163 | if (ret != 0) | 169 | if (ret != 0) |
| 164 | BIO_set_retry_read(b); | 170 | BIO_set_retry_read(b); |
| 165 | } | ||
| 166 | return(ret); | ||
| 167 | } | 171 | } |
| 172 | return (ret); | ||
| 173 | } | ||
| 168 | 174 | ||
| 169 | static int mem_write(BIO *b, const char *in, int inl) | 175 | static int |
| 170 | { | 176 | mem_write(BIO *b, const char *in, int inl) |
| 171 | int ret= -1; | 177 | { |
| 178 | int ret = -1; | ||
| 172 | int blen; | 179 | int blen; |
| 173 | BUF_MEM *bm; | 180 | BUF_MEM *bm; |
| 174 | 181 | ||
| 175 | bm=(BUF_MEM *)b->ptr; | 182 | bm = (BUF_MEM *)b->ptr; |
| 176 | if (in == NULL) | 183 | if (in == NULL) { |
| 177 | { | 184 | BIOerr(BIO_F_MEM_WRITE, BIO_R_NULL_PARAMETER); |
| 178 | BIOerr(BIO_F_MEM_WRITE,BIO_R_NULL_PARAMETER); | ||
| 179 | goto end; | 185 | goto end; |
| 180 | } | 186 | } |
| 181 | 187 | ||
| 182 | if(b->flags & BIO_FLAGS_MEM_RDONLY) { | 188 | if (b->flags & BIO_FLAGS_MEM_RDONLY) { |
| 183 | BIOerr(BIO_F_MEM_WRITE,BIO_R_WRITE_TO_READ_ONLY_BIO); | 189 | BIOerr(BIO_F_MEM_WRITE, BIO_R_WRITE_TO_READ_ONLY_BIO); |
| 184 | goto end; | 190 | goto end; |
| 185 | } | 191 | } |
| 186 | 192 | ||
| 187 | BIO_clear_retry_flags(b); | 193 | BIO_clear_retry_flags(b); |
| 188 | blen=bm->length; | 194 | blen = bm->length; |
| 189 | if (BUF_MEM_grow_clean(bm,blen+inl) != (blen+inl)) | 195 | if (BUF_MEM_grow_clean(bm, blen + inl) != (blen + inl)) |
| 190 | goto end; | 196 | goto end; |
| 191 | memcpy(&(bm->data[blen]),in,inl); | 197 | memcpy(&(bm->data[blen]), in, inl); |
| 192 | ret=inl; | 198 | ret = inl; |
| 193 | end: | 199 | end: |
| 194 | return(ret); | 200 | return (ret); |
| 195 | } | 201 | } |
| 196 | 202 | ||
| 197 | static long mem_ctrl(BIO *b, int cmd, long num, void *ptr) | 203 | static long |
| 198 | { | 204 | mem_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 199 | long ret=1; | 205 | { |
| 206 | long ret = 1; | ||
| 200 | char **pptr; | 207 | char **pptr; |
| 201 | 208 | ||
| 202 | BUF_MEM *bm=(BUF_MEM *)b->ptr; | 209 | BUF_MEM *bm = (BUF_MEM *)b->ptr; |
| 203 | 210 | ||
| 204 | switch (cmd) | 211 | switch (cmd) { |
| 205 | { | ||
| 206 | case BIO_CTRL_RESET: | 212 | case BIO_CTRL_RESET: |
| 207 | if (bm->data != NULL) | 213 | if (bm->data != NULL) { |
| 208 | { | ||
| 209 | /* For read only case reset to the start again */ | 214 | /* For read only case reset to the start again */ |
| 210 | if(b->flags & BIO_FLAGS_MEM_RDONLY) | 215 | if (b->flags & BIO_FLAGS_MEM_RDONLY) { |
| 211 | { | ||
| 212 | bm->data -= bm->max - bm->length; | 216 | bm->data -= bm->max - bm->length; |
| 213 | bm->length = bm->max; | 217 | bm->length = bm->max; |
| 214 | } | 218 | } else { |
| 215 | else | 219 | memset(bm->data, 0, bm->max); |
| 216 | { | 220 | bm->length = 0; |
| 217 | memset(bm->data,0,bm->max); | ||
| 218 | bm->length=0; | ||
| 219 | } | ||
| 220 | } | 221 | } |
| 222 | } | ||
| 221 | break; | 223 | break; |
| 222 | case BIO_CTRL_EOF: | 224 | case BIO_CTRL_EOF: |
| 223 | ret=(long)(bm->length == 0); | 225 | ret = (long)(bm->length == 0); |
| 224 | break; | 226 | break; |
| 225 | case BIO_C_SET_BUF_MEM_EOF_RETURN: | 227 | case BIO_C_SET_BUF_MEM_EOF_RETURN: |
| 226 | b->num=(int)num; | 228 | b->num = (int)num; |
| 227 | break; | 229 | break; |
| 228 | case BIO_CTRL_INFO: | 230 | case BIO_CTRL_INFO: |
| 229 | ret=(long)bm->length; | 231 | ret = (long)bm->length; |
| 230 | if (ptr != NULL) | 232 | if (ptr != NULL) { |
| 231 | { | 233 | pptr = (char **)ptr; |
| 232 | pptr=(char **)ptr; | 234 | *pptr = (char *)&(bm->data[0]); |
| 233 | *pptr=(char *)&(bm->data[0]); | 235 | } |
| 234 | } | ||
| 235 | break; | 236 | break; |
| 236 | case BIO_C_SET_BUF_MEM: | 237 | case BIO_C_SET_BUF_MEM: |
| 237 | mem_free(b); | 238 | mem_free(b); |
| 238 | b->shutdown=(int)num; | 239 | b->shutdown = (int)num; |
| 239 | b->ptr=ptr; | 240 | b->ptr = ptr; |
| 240 | break; | 241 | break; |
| 241 | case BIO_C_GET_BUF_MEM_PTR: | 242 | case BIO_C_GET_BUF_MEM_PTR: |
| 242 | if (ptr != NULL) | 243 | if (ptr != NULL) { |
| 243 | { | 244 | pptr = (char **)ptr; |
| 244 | pptr=(char **)ptr; | 245 | *pptr = (char *)bm; |
| 245 | *pptr=(char *)bm; | 246 | } |
| 246 | } | ||
| 247 | break; | 247 | break; |
| 248 | case BIO_CTRL_GET_CLOSE: | 248 | case BIO_CTRL_GET_CLOSE: |
| 249 | ret=(long)b->shutdown; | 249 | ret = (long)b->shutdown; |
| 250 | break; | 250 | break; |
| 251 | case BIO_CTRL_SET_CLOSE: | 251 | case BIO_CTRL_SET_CLOSE: |
| 252 | b->shutdown=(int)num; | 252 | b->shutdown = (int)num; |
| 253 | break; | 253 | break; |
| 254 | 254 | ||
| 255 | case BIO_CTRL_WPENDING: | 255 | case BIO_CTRL_WPENDING: |
| 256 | ret=0L; | 256 | ret = 0L; |
| 257 | break; | 257 | break; |
| 258 | case BIO_CTRL_PENDING: | 258 | case BIO_CTRL_PENDING: |
| 259 | ret=(long)bm->length; | 259 | ret = (long)bm->length; |
| 260 | break; | 260 | break; |
| 261 | case BIO_CTRL_DUP: | 261 | case BIO_CTRL_DUP: |
| 262 | case BIO_CTRL_FLUSH: | 262 | case BIO_CTRL_FLUSH: |
| 263 | ret=1; | 263 | ret = 1; |
| 264 | break; | 264 | break; |
| 265 | case BIO_CTRL_PUSH: | 265 | case BIO_CTRL_PUSH: |
| 266 | case BIO_CTRL_POP: | 266 | case BIO_CTRL_POP: |
| 267 | default: | 267 | default: |
| 268 | ret=0; | 268 | ret = 0; |
| 269 | break; | 269 | break; |
| 270 | } | ||
| 271 | return(ret); | ||
| 272 | } | 270 | } |
| 271 | return (ret); | ||
| 272 | } | ||
| 273 | 273 | ||
| 274 | static int mem_gets(BIO *bp, char *buf, int size) | 274 | static int |
| 275 | { | 275 | mem_gets(BIO *bp, char *buf, int size) |
| 276 | int i,j; | 276 | { |
| 277 | int ret= -1; | 277 | int i, j; |
| 278 | int ret = -1; | ||
| 278 | char *p; | 279 | char *p; |
| 279 | BUF_MEM *bm=(BUF_MEM *)bp->ptr; | 280 | BUF_MEM *bm = (BUF_MEM *)bp->ptr; |
| 280 | 281 | ||
| 281 | BIO_clear_retry_flags(bp); | 282 | BIO_clear_retry_flags(bp); |
| 282 | j=bm->length; | 283 | j = bm->length; |
| 283 | if ((size-1) < j) j=size-1; | 284 | if ((size - 1) < j) |
| 284 | if (j <= 0) | 285 | j = size - 1; |
| 285 | { | 286 | if (j <= 0) { |
| 286 | *buf='\0'; | 287 | *buf = '\0'; |
| 287 | return 0; | 288 | return 0; |
| 288 | } | 289 | } |
| 289 | p=bm->data; | 290 | p = bm->data; |
| 290 | for (i=0; i<j; i++) | 291 | for (i = 0; i < j; i++) { |
| 291 | { | 292 | if (p[i] == '\n') { |
| 292 | if (p[i] == '\n') | ||
| 293 | { | ||
| 294 | i++; | 293 | i++; |
| 295 | break; | 294 | break; |
| 296 | } | ||
| 297 | } | 295 | } |
| 296 | } | ||
| 298 | 297 | ||
| 299 | /* | 298 | /* |
| 300 | * i is now the max num of bytes to copy, either j or up to | 299 | * i is now the max num of bytes to copy, either j or up to |
| 301 | * and including the first newline | 300 | * and including the first newline |
| 302 | */ | 301 | */ |
| 303 | 302 | ||
| 304 | i=mem_read(bp,buf,i); | 303 | i = mem_read(bp, buf, i); |
| 305 | if (i > 0) buf[i]='\0'; | 304 | if (i > 0) |
| 306 | ret=i; | 305 | buf[i] = '\0'; |
| 307 | return(ret); | 306 | ret = i; |
| 308 | } | 307 | return (ret); |
| 308 | } | ||
| 309 | 309 | ||
| 310 | static int mem_puts(BIO *bp, const char *str) | 310 | static int |
| 311 | { | 311 | mem_puts(BIO *bp, const char *str) |
| 312 | int n,ret; | 312 | { |
| 313 | int n, ret; | ||
| 313 | 314 | ||
| 314 | n=strlen(str); | 315 | n = strlen(str); |
| 315 | ret=mem_write(bp,str,n); | 316 | ret = mem_write(bp, str, n); |
| 316 | /* memory semantics is that it will always work */ | 317 | /* memory semantics is that it will always work */ |
| 317 | return(ret); | 318 | return (ret); |
| 318 | } | 319 | } |
| 319 | |||
diff --git a/src/lib/libcrypto/bio/bss_null.c b/src/lib/libcrypto/bio/bss_null.c index 46b73339df..51aed2ac4b 100644 --- a/src/lib/libcrypto/bio/bss_null.c +++ b/src/lib/libcrypto/bio/bss_null.c | |||
| @@ -68,8 +68,8 @@ static int null_gets(BIO *h, char *str, int size); | |||
| 68 | static long null_ctrl(BIO *h, int cmd, long arg1, void *arg2); | 68 | static long null_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 69 | static int null_new(BIO *h); | 69 | static int null_new(BIO *h); |
| 70 | static int null_free(BIO *data); | 70 | static int null_free(BIO *data); |
| 71 | static BIO_METHOD null_method= | 71 | |
| 72 | { | 72 | static BIO_METHOD null_method = { |
| 73 | BIO_TYPE_NULL, | 73 | BIO_TYPE_NULL, |
| 74 | "NULL", | 74 | "NULL", |
| 75 | null_write, | 75 | null_write, |
| @@ -80,50 +80,56 @@ static BIO_METHOD null_method= | |||
| 80 | null_new, | 80 | null_new, |
| 81 | null_free, | 81 | null_free, |
| 82 | NULL, | 82 | NULL, |
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | BIO_METHOD *BIO_s_null(void) | 85 | BIO_METHOD |
| 86 | { | 86 | *BIO_s_null(void) |
| 87 | return(&null_method); | 87 | { |
| 88 | } | 88 | return (&null_method); |
| 89 | } | ||
| 89 | 90 | ||
| 90 | static int null_new(BIO *bi) | 91 | static int |
| 91 | { | 92 | null_new(BIO *bi) |
| 92 | bi->init=1; | 93 | { |
| 93 | bi->num=0; | 94 | bi->init = 1; |
| 94 | bi->ptr=(NULL); | 95 | bi->num = 0; |
| 95 | return(1); | 96 | bi->ptr = (NULL); |
| 96 | } | 97 | return (1); |
| 98 | } | ||
| 97 | 99 | ||
| 98 | static int null_free(BIO *a) | 100 | static int |
| 99 | { | 101 | null_free(BIO *a) |
| 100 | if (a == NULL) return(0); | 102 | { |
| 101 | return(1); | 103 | if (a == NULL) |
| 102 | } | 104 | return (0); |
| 103 | 105 | return (1); | |
| 104 | static int null_read(BIO *b, char *out, int outl) | 106 | } |
| 105 | { | ||
| 106 | return(0); | ||
| 107 | } | ||
| 108 | 107 | ||
| 109 | static int null_write(BIO *b, const char *in, int inl) | 108 | static int |
| 110 | { | 109 | null_read(BIO *b, char *out, int outl) |
| 111 | return(inl); | 110 | { |
| 112 | } | 111 | return (0); |
| 112 | } | ||
| 113 | |||
| 114 | static int | ||
| 115 | null_write(BIO *b, const char *in, int inl) | ||
| 116 | { | ||
| 117 | return (inl); | ||
| 118 | } | ||
| 113 | 119 | ||
| 114 | static long null_ctrl(BIO *b, int cmd, long num, void *ptr) | 120 | static long |
| 115 | { | 121 | null_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 116 | long ret=1; | 122 | { |
| 123 | long ret = 1; | ||
| 117 | 124 | ||
| 118 | switch (cmd) | 125 | switch (cmd) { |
| 119 | { | ||
| 120 | case BIO_CTRL_RESET: | 126 | case BIO_CTRL_RESET: |
| 121 | case BIO_CTRL_EOF: | 127 | case BIO_CTRL_EOF: |
| 122 | case BIO_CTRL_SET: | 128 | case BIO_CTRL_SET: |
| 123 | case BIO_CTRL_SET_CLOSE: | 129 | case BIO_CTRL_SET_CLOSE: |
| 124 | case BIO_CTRL_FLUSH: | 130 | case BIO_CTRL_FLUSH: |
| 125 | case BIO_CTRL_DUP: | 131 | case BIO_CTRL_DUP: |
| 126 | ret=1; | 132 | ret = 1; |
| 127 | break; | 133 | break; |
| 128 | case BIO_CTRL_GET_CLOSE: | 134 | case BIO_CTRL_GET_CLOSE: |
| 129 | case BIO_CTRL_INFO: | 135 | case BIO_CTRL_INFO: |
| @@ -131,20 +137,22 @@ static long null_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 131 | case BIO_CTRL_PENDING: | 137 | case BIO_CTRL_PENDING: |
| 132 | case BIO_CTRL_WPENDING: | 138 | case BIO_CTRL_WPENDING: |
| 133 | default: | 139 | default: |
| 134 | ret=0; | 140 | ret = 0; |
| 135 | break; | 141 | break; |
| 136 | } | ||
| 137 | return(ret); | ||
| 138 | } | 142 | } |
| 143 | return (ret); | ||
| 144 | } | ||
| 139 | 145 | ||
| 140 | static int null_gets(BIO *bp, char *buf, int size) | 146 | static int |
| 141 | { | 147 | null_gets(BIO *bp, char *buf, int size) |
| 142 | return(0); | 148 | { |
| 143 | } | 149 | return (0); |
| 144 | 150 | } | |
| 145 | static int null_puts(BIO *bp, const char *str) | ||
| 146 | { | ||
| 147 | if (str == NULL) return(0); | ||
| 148 | return(strlen(str)); | ||
| 149 | } | ||
| 150 | 151 | ||
| 152 | static int | ||
| 153 | null_puts(BIO *bp, const char *str) | ||
| 154 | { | ||
| 155 | if (str == NULL) | ||
| 156 | return (0); | ||
| 157 | return (strlen(str)); | ||
| 158 | } | ||
diff --git a/src/lib/libcrypto/bio/bss_rtcp.c b/src/lib/libcrypto/bio/bss_rtcp.c index 7dae485564..84d01e58b4 100644 --- a/src/lib/libcrypto/bio/bss_rtcp.c +++ b/src/lib/libcrypto/bio/bss_rtcp.c | |||
| @@ -73,31 +73,32 @@ | |||
| 73 | 73 | ||
| 74 | typedef unsigned short io_channel; | 74 | typedef unsigned short io_channel; |
| 75 | /*************************************************************************/ | 75 | /*************************************************************************/ |
| 76 | struct io_status { short status, count; long flags; }; | 76 | struct io_status { short status, count; |
| 77 | long flags; | ||
| 78 | }; | ||
| 77 | 79 | ||
| 78 | struct rpc_msg { /* Should have member alignment inhibited */ | 80 | struct rpc_msg { /* Should have member alignment inhibited */ |
| 79 | char channel; /* 'A'-app data. 'R'-remote client 'G'-global */ | 81 | char channel; /* 'A'-app data. 'R'-remote client 'G'-global */ |
| 80 | char function; /* 'G'-get, 'P'-put, 'C'-confirm, 'X'-close */ | 82 | char function; /* 'G'-get, 'P'-put, 'C'-confirm, 'X'-close */ |
| 81 | unsigned short int length; /* Amount of data returned or max to return */ | 83 | unsigned short int length; /* Amount of data returned or max to return */ |
| 82 | char data[4092]; /* variable data */ | 84 | char data[4092]; /* variable data */ |
| 83 | }; | 85 | }; |
| 84 | #define RPC_HDR_SIZE (sizeof(struct rpc_msg) - 4092) | 86 | #define RPC_HDR_SIZE (sizeof(struct rpc_msg) - 4092) |
| 85 | 87 | ||
| 86 | struct rpc_ctx { | 88 | struct rpc_ctx { |
| 87 | int filled, pos; | 89 | int filled, pos; |
| 88 | struct rpc_msg msg; | 90 | struct rpc_msg msg; |
| 89 | }; | 91 | }; |
| 90 | 92 | ||
| 91 | static int rtcp_write(BIO *h,const char *buf,int num); | 93 | static int rtcp_write(BIO *h, const char *buf, int num); |
| 92 | static int rtcp_read(BIO *h,char *buf,int size); | 94 | static int rtcp_read(BIO *h, char *buf, int size); |
| 93 | static int rtcp_puts(BIO *h,const char *str); | 95 | static int rtcp_puts(BIO *h, const char *str); |
| 94 | static int rtcp_gets(BIO *h,char *str,int size); | 96 | static int rtcp_gets(BIO *h, char *str, int size); |
| 95 | static long rtcp_ctrl(BIO *h,int cmd,long arg1,void *arg2); | 97 | static long rtcp_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 96 | static int rtcp_new(BIO *h); | 98 | static int rtcp_new(BIO *h); |
| 97 | static int rtcp_free(BIO *data); | 99 | static int rtcp_free(BIO *data); |
| 98 | 100 | ||
| 99 | static BIO_METHOD rtcp_method= | 101 | static BIO_METHOD rtcp_method = { |
| 100 | { | ||
| 101 | BIO_TYPE_FD, | 102 | BIO_TYPE_FD, |
| 102 | "RTCP", | 103 | "RTCP", |
| 103 | rtcp_write, | 104 | rtcp_write, |
| @@ -108,12 +109,13 @@ static BIO_METHOD rtcp_method= | |||
| 108 | rtcp_new, | 109 | rtcp_new, |
| 109 | rtcp_free, | 110 | rtcp_free, |
| 110 | NULL, | 111 | NULL, |
| 111 | }; | 112 | }; |
| 112 | 113 | ||
| 113 | BIO_METHOD *BIO_s_rtcp(void) | 114 | BIO_METHOD |
| 114 | { | 115 | *BIO_s_rtcp(void) |
| 115 | return(&rtcp_method); | 116 | { |
| 116 | } | 117 | return (&rtcp_method); |
| 118 | } | ||
| 117 | /*****************************************************************************/ | 119 | /*****************************************************************************/ |
| 118 | /* Decnet I/O routines. | 120 | /* Decnet I/O routines. |
| 119 | */ | 121 | */ |
| @@ -123,25 +125,28 @@ BIO_METHOD *BIO_s_rtcp(void) | |||
| 123 | #pragma message disable DOLLARID | 125 | #pragma message disable DOLLARID |
| 124 | #endif | 126 | #endif |
| 125 | 127 | ||
| 126 | static int get ( io_channel chan, char *buffer, int maxlen, int *length ) | 128 | static int get(io_channel chan, char *buffer, int maxlen, int *length) |
| 127 | { | 129 | { |
| 128 | int status; | 130 | int status; |
| 129 | struct io_status iosb; | 131 | struct io_status iosb; |
| 130 | status = sys$qiow ( 0, chan, IO$_READVBLK, &iosb, 0, 0, | 132 | status = sys$qiow(0, chan, IO$_READVBLK, &iosb, 0, 0, buffer, maxlen, |
| 131 | buffer, maxlen, 0, 0, 0, 0 ); | 133 | 0, 0, 0, 0 ); |
| 132 | if ( (status&1) == 1 ) status = iosb.status; | 134 | if ((status & 1) == 1) |
| 133 | if ( (status&1) == 1 ) *length = iosb.count; | 135 | status = iosb.status; |
| 134 | return status; | 136 | if ((status & 1) == 1 ) |
| 137 | *length = iosb.count; | ||
| 138 | return status; | ||
| 135 | } | 139 | } |
| 136 | 140 | ||
| 137 | static int put ( io_channel chan, char *buffer, int length ) | 141 | static int put(io_channel chan, char *buffer, int length) |
| 138 | { | 142 | { |
| 139 | int status; | 143 | int status; |
| 140 | struct io_status iosb; | 144 | struct io_status iosb; |
| 141 | status = sys$qiow ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0, | 145 | status = sys$qiow ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0, buffer, |
| 142 | buffer, length, 0, 0, 0, 0 ); | 146 | length, 0, 0, 0, 0 ); |
| 143 | if ( (status&1) == 1 ) status = iosb.status; | 147 | if ((status & 1) == 1) |
| 144 | return status; | 148 | status = iosb.status; |
| 149 | return status; | ||
| 145 | } | 150 | } |
| 146 | 151 | ||
| 147 | #ifdef __DECC | 152 | #ifdef __DECC |
| @@ -150,109 +155,127 @@ static int put ( io_channel chan, char *buffer, int length ) | |||
| 150 | 155 | ||
| 151 | /***************************************************************************/ | 156 | /***************************************************************************/ |
| 152 | 157 | ||
| 153 | static int rtcp_new(BIO *bi) | 158 | static int |
| 159 | rtcp_new(BIO *bi) | ||
| 154 | { | 160 | { |
| 155 | struct rpc_ctx *ctx; | 161 | struct rpc_ctx *ctx; |
| 156 | bi->init=1; | 162 | bi->init = 1; |
| 157 | bi->num=0; | 163 | bi->num = 0; |
| 158 | bi->flags = 0; | 164 | bi->flags = 0; |
| 159 | bi->ptr=OPENSSL_malloc(sizeof(struct rpc_ctx)); | 165 | bi->ptr = OPENSSL_malloc(sizeof(struct rpc_ctx)); |
| 160 | ctx = (struct rpc_ctx *) bi->ptr; | 166 | ctx = (struct rpc_ctx *)bi->ptr; |
| 161 | ctx->filled = 0; | 167 | ctx->filled = 0; |
| 162 | ctx->pos = 0; | 168 | ctx->pos = 0; |
| 163 | return(1); | 169 | return (1); |
| 164 | } | 170 | } |
| 165 | 171 | ||
| 166 | static int rtcp_free(BIO *a) | 172 | static int |
| 173 | rtcp_free(BIO *a) | ||
| 167 | { | 174 | { |
| 168 | if (a == NULL) return(0); | 175 | if (a == NULL) |
| 169 | if ( a->ptr ) OPENSSL_free ( a->ptr ); | 176 | return (0); |
| 177 | if (a->ptr) | ||
| 178 | OPENSSL_free(a->ptr); | ||
| 170 | a->ptr = NULL; | 179 | a->ptr = NULL; |
| 171 | return(1); | 180 | return (1); |
| 172 | } | 181 | } |
| 173 | 182 | ||
| 174 | static int rtcp_read(BIO *b, char *out, int outl) | 183 | static int |
| 184 | rtcp_read(BIO *b, char *out, int outl) | ||
| 175 | { | 185 | { |
| 176 | int status, length; | 186 | int status, length; |
| 177 | struct rpc_ctx *ctx; | 187 | struct rpc_ctx *ctx; |
| 178 | /* | 188 | /* |
| 179 | * read data, return existing. | 189 | * read data, return existing. |
| 180 | */ | 190 | */ |
| 181 | ctx = (struct rpc_ctx *) b->ptr; | 191 | ctx = (struct rpc_ctx *)b->ptr; |
| 182 | if ( ctx->pos < ctx->filled ) { | 192 | if (ctx->pos < ctx->filled) { |
| 183 | length = ctx->filled - ctx->pos; | 193 | length = ctx->filled - ctx->pos; |
| 184 | if ( length > outl ) length = outl; | 194 | if (length > outl) |
| 185 | memmove ( out, &ctx->msg.data[ctx->pos], length ); | 195 | length = outl; |
| 186 | ctx->pos += length; | 196 | memmove(out, &ctx->msg.data[ctx->pos], length); |
| 187 | return length; | 197 | ctx->pos += length; |
| 188 | } | 198 | return length; |
| 189 | /* | 199 | } |
| 190 | * Requst more data from R channel. | 200 | /* |
| 191 | */ | 201 | * Requst more data from R channel. |
| 192 | ctx->msg.channel = 'R'; | 202 | */ |
| 193 | ctx->msg.function = 'G'; | 203 | ctx->msg.channel = 'R'; |
| 194 | ctx->msg.length = sizeof(ctx->msg.data); | 204 | ctx->msg.function = 'G'; |
| 195 | status = put ( b->num, (char *) &ctx->msg, RPC_HDR_SIZE ); | 205 | ctx->msg.length = sizeof(ctx->msg.data); |
| 196 | if ( (status&1) == 0 ) { | 206 | status = put(b->num, (char *)&ctx->msg, RPC_HDR_SIZE); |
| 197 | return -1; | 207 | if ((status & 1) == 0 ) { |
| 198 | } | 208 | return -1; |
| 199 | /* | 209 | } |
| 200 | * Read. | 210 | /* |
| 201 | */ | 211 | * Read. |
| 202 | ctx->pos = ctx->filled = 0; | 212 | */ |
| 203 | status = get ( b->num, (char *) &ctx->msg, sizeof(ctx->msg), &length ); | 213 | ctx->pos = ctx->filled = 0; |
| 204 | if ( (status&1) == 0 ) length = -1; | 214 | status = get(b->num, (char *)&ctx->msg, sizeof(ctx->msg), &length); |
| 205 | if ( ctx->msg.channel != 'R' || ctx->msg.function != 'C' ) { | 215 | if ((status & 1) == 0) |
| 206 | length = -1; | 216 | length = -1; |
| 207 | } | 217 | if (ctx->msg.channel != 'R' || ctx->msg.function != 'C') { |
| 208 | ctx->filled = length - RPC_HDR_SIZE; | 218 | length = -1; |
| 209 | 219 | } | |
| 210 | if ( ctx->pos < ctx->filled ) { | 220 | ctx->filled = length - RPC_HDR_SIZE; |
| 211 | length = ctx->filled - ctx->pos; | 221 | |
| 212 | if ( length > outl ) length = outl; | 222 | if (ctx->pos < ctx->filled) { |
| 213 | memmove ( out, ctx->msg.data, length ); | 223 | length = ctx->filled - ctx->pos; |
| 214 | ctx->pos += length; | 224 | if (length > outl) |
| 215 | return length; | 225 | length = outl; |
| 216 | } | 226 | memmove(out, ctx->msg.data, length); |
| 227 | ctx->pos += length; | ||
| 228 | return length; | ||
| 229 | } | ||
| 217 | 230 | ||
| 218 | return length; | 231 | return length; |
| 219 | } | 232 | } |
| 220 | 233 | ||
| 221 | static int rtcp_write(BIO *b, const char *in, int inl) | 234 | static int |
| 235 | rtcp_write(BIO *b, const char *in, int inl) | ||
| 222 | { | 236 | { |
| 223 | int status, i, segment, length; | 237 | int status, i, segment, length; |
| 224 | struct rpc_ctx *ctx; | 238 | struct rpc_ctx *ctx; |
| 225 | /* | 239 | /* |
| 226 | * Output data, send in chunks no larger that sizeof(ctx->msg.data). | 240 | * Output data, send in chunks no larger that sizeof(ctx->msg.data). |
| 227 | */ | 241 | */ |
| 228 | ctx = (struct rpc_ctx *) b->ptr; | 242 | ctx = (struct rpc_ctx *)b->ptr; |
| 229 | for ( i = 0; i < inl; i += segment ) { | 243 | for (i = 0; i < inl; i += segment) { |
| 230 | segment = inl - i; | 244 | segment = inl - i; |
| 231 | if ( segment > sizeof(ctx->msg.data) ) segment = sizeof(ctx->msg.data); | 245 | if (segment > sizeof(ctx->msg.data)) |
| 232 | ctx->msg.channel = 'R'; | 246 | segment = sizeof(ctx->msg.data); |
| 233 | ctx->msg.function = 'P'; | 247 | ctx->msg.channel = 'R'; |
| 234 | ctx->msg.length = segment; | 248 | ctx->msg.function = 'P'; |
| 235 | memmove ( ctx->msg.data, &in[i], segment ); | 249 | ctx->msg.length = segment; |
| 236 | status = put ( b->num, (char *) &ctx->msg, segment + RPC_HDR_SIZE ); | 250 | memmove(ctx->msg.data, &in[i], segment); |
| 237 | if ((status&1) == 0 ) { i = -1; break; } | 251 | status = put(b->num, (char *) &ctx->msg, |
| 252 | segment + RPC_HDR_SIZE); | ||
| 253 | if ((status & 1) == 0) { | ||
| 254 | i = -1; | ||
| 255 | break; | ||
| 256 | } | ||
| 238 | 257 | ||
| 239 | status = get ( b->num, (char *) &ctx->msg, sizeof(ctx->msg), &length ); | 258 | status = get(b->num, (char *)&ctx->msg, sizeof(ctx->msg), |
| 240 | if ( ((status&1) == 0) || (length < RPC_HDR_SIZE) ) { i = -1; break; } | 259 | &length ); |
| 241 | if ( (ctx->msg.channel != 'R') || (ctx->msg.function != 'C') ) { | 260 | if (((status&1) == 0) || (length < RPC_HDR_SIZE)) { |
| 242 | printf("unexpected response when confirming put %c %c\n", | 261 | i = -1; |
| 243 | ctx->msg.channel, ctx->msg.function ); | 262 | break; |
| 263 | } | ||
| 264 | if ((ctx->msg.channel != 'R') || (ctx->msg.function != 'C')) { | ||
| 265 | printf("unexpected response when confirming put %c %c\n", | ||
| 266 | ctx->msg.channel, ctx->msg.function ); | ||
| 244 | 267 | ||
| 268 | } | ||
| 245 | } | 269 | } |
| 246 | } | 270 | return (i); |
| 247 | return(i); | ||
| 248 | } | 271 | } |
| 249 | 272 | ||
| 250 | static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) | 273 | static long |
| 251 | { | 274 | rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 252 | long ret=1; | 275 | { |
| 276 | long ret = 1; | ||
| 253 | 277 | ||
| 254 | switch (cmd) | 278 | switch (cmd) { |
| 255 | { | ||
| 256 | case BIO_CTRL_RESET: | 279 | case BIO_CTRL_RESET: |
| 257 | case BIO_CTRL_EOF: | 280 | case BIO_CTRL_EOF: |
| 258 | ret = 1; | 281 | ret = 1; |
| @@ -260,11 +283,11 @@ static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 260 | case BIO_C_SET_FD: | 283 | case BIO_C_SET_FD: |
| 261 | b->num = num; | 284 | b->num = num; |
| 262 | ret = 1; | 285 | ret = 1; |
| 263 | break; | 286 | break; |
| 264 | case BIO_CTRL_SET_CLOSE: | 287 | case BIO_CTRL_SET_CLOSE: |
| 265 | case BIO_CTRL_FLUSH: | 288 | case BIO_CTRL_FLUSH: |
| 266 | case BIO_CTRL_DUP: | 289 | case BIO_CTRL_DUP: |
| 267 | ret=1; | 290 | ret = 1; |
| 268 | break; | 291 | break; |
| 269 | case BIO_CTRL_GET_CLOSE: | 292 | case BIO_CTRL_GET_CLOSE: |
| 270 | case BIO_CTRL_INFO: | 293 | case BIO_CTRL_INFO: |
| @@ -272,23 +295,26 @@ static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 272 | case BIO_CTRL_PENDING: | 295 | case BIO_CTRL_PENDING: |
| 273 | case BIO_CTRL_WPENDING: | 296 | case BIO_CTRL_WPENDING: |
| 274 | default: | 297 | default: |
| 275 | ret=0; | 298 | ret = 0; |
| 276 | break; | 299 | break; |
| 277 | } | ||
| 278 | return(ret); | ||
| 279 | } | ||
| 280 | |||
| 281 | static int rtcp_gets(BIO *bp, char *buf, int size) | ||
| 282 | { | ||
| 283 | return(0); | ||
| 284 | } | 300 | } |
| 301 | return (ret); | ||
| 302 | } | ||
| 285 | 303 | ||
| 286 | static int rtcp_puts(BIO *bp, const char *str) | 304 | static int |
| 305 | rtcp_gets(BIO *bp, char *buf, int size) | ||
| 287 | { | 306 | { |
| 288 | int length; | 307 | return (0); |
| 289 | if (str == NULL) return(0); | ||
| 290 | length = strlen ( str ); | ||
| 291 | if ( length == 0 ) return (0); | ||
| 292 | return rtcp_write ( bp,str, length ); | ||
| 293 | } | 308 | } |
| 294 | 309 | ||
| 310 | static int | ||
| 311 | rtcp_puts(BIO *bp, const char *str) | ||
| 312 | { | ||
| 313 | int length; | ||
| 314 | if (str == NULL) | ||
| 315 | return (0); | ||
| 316 | length = strlen(str); | ||
| 317 | if (length == 0) | ||
| 318 | return (0); | ||
| 319 | return rtcp_write(bp, str, length); | ||
| 320 | } | ||
diff --git a/src/lib/libcrypto/bio/bss_sock.c b/src/lib/libcrypto/bio/bss_sock.c index eb2965970c..f6d3bf7365 100644 --- a/src/lib/libcrypto/bio/bss_sock.c +++ b/src/lib/libcrypto/bio/bss_sock.c | |||
| @@ -79,8 +79,7 @@ static int sock_new(BIO *h); | |||
| 79 | static int sock_free(BIO *data); | 79 | static int sock_free(BIO *data); |
| 80 | int BIO_sock_should_retry(int s); | 80 | int BIO_sock_should_retry(int s); |
| 81 | 81 | ||
| 82 | static BIO_METHOD methods_sockp= | 82 | static BIO_METHOD methods_sockp = { |
| 83 | { | ||
| 84 | BIO_TYPE_SOCKET, | 83 | BIO_TYPE_SOCKET, |
| 85 | "socket", | 84 | "socket", |
| 86 | sock_write, | 85 | sock_write, |
| @@ -91,152 +90,155 @@ static BIO_METHOD methods_sockp= | |||
| 91 | sock_new, | 90 | sock_new, |
| 92 | sock_free, | 91 | sock_free, |
| 93 | NULL, | 92 | NULL, |
| 94 | }; | 93 | }; |
| 95 | 94 | ||
| 96 | BIO_METHOD *BIO_s_socket(void) | 95 | BIO_METHOD |
| 97 | { | 96 | *BIO_s_socket(void) |
| 98 | return(&methods_sockp); | 97 | { |
| 99 | } | 98 | return (&methods_sockp); |
| 99 | } | ||
| 100 | 100 | ||
| 101 | BIO *BIO_new_socket(int fd, int close_flag) | 101 | BIO |
| 102 | { | 102 | *BIO_new_socket(int fd, int close_flag) |
| 103 | { | ||
| 103 | BIO *ret; | 104 | BIO *ret; |
| 104 | 105 | ||
| 105 | ret=BIO_new(BIO_s_socket()); | 106 | ret = BIO_new(BIO_s_socket()); |
| 106 | if (ret == NULL) return(NULL); | 107 | if (ret == NULL) |
| 107 | BIO_set_fd(ret,fd,close_flag); | 108 | return (NULL); |
| 108 | return(ret); | 109 | BIO_set_fd(ret, fd, close_flag); |
| 109 | } | 110 | return (ret); |
| 111 | } | ||
| 110 | 112 | ||
| 111 | static int sock_new(BIO *bi) | 113 | static int |
| 112 | { | 114 | sock_new(BIO *bi) |
| 113 | bi->init=0; | 115 | { |
| 114 | bi->num=0; | 116 | bi->init = 0; |
| 115 | bi->ptr=NULL; | 117 | bi->num = 0; |
| 116 | bi->flags=0; | 118 | bi->ptr = NULL; |
| 117 | return(1); | 119 | bi->flags = 0; |
| 118 | } | 120 | return (1); |
| 121 | } | ||
| 119 | 122 | ||
| 120 | static int sock_free(BIO *a) | 123 | static int |
| 121 | { | 124 | sock_free(BIO *a) |
| 122 | if (a == NULL) return(0); | 125 | { |
| 123 | if (a->shutdown) | 126 | if (a == NULL) |
| 124 | { | 127 | return (0); |
| 125 | if (a->init) | 128 | if (a->shutdown) { |
| 126 | { | 129 | if (a->init) { |
| 127 | shutdown(a->num, SHUT_RDWR); | 130 | shutdown(a->num, SHUT_RDWR); |
| 128 | close(a->num); | 131 | close(a->num); |
| 129 | } | ||
| 130 | a->init=0; | ||
| 131 | a->flags=0; | ||
| 132 | } | 132 | } |
| 133 | return(1); | 133 | a->init = 0; |
| 134 | a->flags = 0; | ||
| 134 | } | 135 | } |
| 135 | 136 | return (1); | |
| 136 | static int sock_read(BIO *b, char *out, int outl) | 137 | } |
| 137 | { | ||
| 138 | int ret=0; | ||
| 139 | 138 | ||
| 140 | if (out != NULL) | 139 | static int |
| 141 | { | 140 | sock_read(BIO *b, char *out, int outl) |
| 141 | { | ||
| 142 | int ret = 0; | ||
| 143 | |||
| 144 | if (out != NULL) { | ||
| 142 | errno = 0; | 145 | errno = 0; |
| 143 | ret=read(b->num,out,outl); | 146 | ret = read(b->num, out, outl); |
| 144 | BIO_clear_retry_flags(b); | 147 | BIO_clear_retry_flags(b); |
| 145 | if (ret <= 0) | 148 | if (ret <= 0) { |
| 146 | { | ||
| 147 | if (BIO_sock_should_retry(ret)) | 149 | if (BIO_sock_should_retry(ret)) |
| 148 | BIO_set_retry_read(b); | 150 | BIO_set_retry_read(b); |
| 149 | } | ||
| 150 | } | 151 | } |
| 151 | return(ret); | ||
| 152 | } | 152 | } |
| 153 | return (ret); | ||
| 154 | } | ||
| 153 | 155 | ||
| 154 | static int sock_write(BIO *b, const char *in, int inl) | 156 | static int |
| 155 | { | 157 | sock_write(BIO *b, const char *in, int inl) |
| 158 | { | ||
| 156 | int ret; | 159 | int ret; |
| 157 | 160 | ||
| 158 | errno = 0; | 161 | errno = 0; |
| 159 | ret=write(b->num,in,inl); | 162 | ret = write(b->num, in, inl); |
| 160 | BIO_clear_retry_flags(b); | 163 | BIO_clear_retry_flags(b); |
| 161 | if (ret <= 0) | 164 | if (ret <= 0) { |
| 162 | { | ||
| 163 | if (BIO_sock_should_retry(ret)) | 165 | if (BIO_sock_should_retry(ret)) |
| 164 | BIO_set_retry_write(b); | 166 | BIO_set_retry_write(b); |
| 165 | } | ||
| 166 | return(ret); | ||
| 167 | } | 167 | } |
| 168 | return (ret); | ||
| 169 | } | ||
| 168 | 170 | ||
| 169 | static long sock_ctrl(BIO *b, int cmd, long num, void *ptr) | 171 | static long |
| 170 | { | 172 | sock_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 171 | long ret=1; | 173 | { |
| 174 | long ret = 1; | ||
| 172 | int *ip; | 175 | int *ip; |
| 173 | 176 | ||
| 174 | switch (cmd) | 177 | switch (cmd) { |
| 175 | { | ||
| 176 | case BIO_C_SET_FD: | 178 | case BIO_C_SET_FD: |
| 177 | sock_free(b); | 179 | sock_free(b); |
| 178 | b->num= *((int *)ptr); | 180 | b->num= *((int *)ptr); |
| 179 | b->shutdown=(int)num; | 181 | b->shutdown = (int)num; |
| 180 | b->init=1; | 182 | b->init = 1; |
| 181 | break; | 183 | break; |
| 182 | case BIO_C_GET_FD: | 184 | case BIO_C_GET_FD: |
| 183 | if (b->init) | 185 | if (b->init) { |
| 184 | { | 186 | ip = (int *)ptr; |
| 185 | ip=(int *)ptr; | 187 | if (ip != NULL) |
| 186 | if (ip != NULL) *ip=b->num; | 188 | *ip = b->num; |
| 187 | ret=b->num; | 189 | ret = b->num; |
| 188 | } | 190 | } else |
| 189 | else | 191 | ret = -1; |
| 190 | ret= -1; | ||
| 191 | break; | 192 | break; |
| 192 | case BIO_CTRL_GET_CLOSE: | 193 | case BIO_CTRL_GET_CLOSE: |
| 193 | ret=b->shutdown; | 194 | ret = b->shutdown; |
| 194 | break; | 195 | break; |
| 195 | case BIO_CTRL_SET_CLOSE: | 196 | case BIO_CTRL_SET_CLOSE: |
| 196 | b->shutdown=(int)num; | 197 | b->shutdown = (int)num; |
| 197 | break; | 198 | break; |
| 198 | case BIO_CTRL_DUP: | 199 | case BIO_CTRL_DUP: |
| 199 | case BIO_CTRL_FLUSH: | 200 | case BIO_CTRL_FLUSH: |
| 200 | ret=1; | 201 | ret = 1; |
| 201 | break; | 202 | break; |
| 202 | default: | 203 | default: |
| 203 | ret=0; | 204 | ret = 0; |
| 204 | break; | 205 | break; |
| 205 | } | ||
| 206 | return(ret); | ||
| 207 | } | 206 | } |
| 207 | return (ret); | ||
| 208 | } | ||
| 208 | 209 | ||
| 209 | static int sock_puts(BIO *bp, const char *str) | 210 | static int |
| 210 | { | 211 | sock_puts(BIO *bp, const char *str) |
| 211 | int n,ret; | 212 | { |
| 213 | int n, ret; | ||
| 212 | 214 | ||
| 213 | n=strlen(str); | 215 | n = strlen(str); |
| 214 | ret=sock_write(bp,str,n); | 216 | ret = sock_write(bp, str, n); |
| 215 | return(ret); | 217 | return (ret); |
| 216 | } | 218 | } |
| 217 | 219 | ||
| 218 | int BIO_sock_should_retry(int i) | 220 | int |
| 219 | { | 221 | BIO_sock_should_retry(int i) |
| 222 | { | ||
| 220 | int err; | 223 | int err; |
| 221 | 224 | ||
| 222 | if ((i == 0) || (i == -1)) | 225 | if ((i == 0) || (i == -1)) { |
| 223 | { | 226 | err = errno; |
| 224 | err=errno; | ||
| 225 | 227 | ||
| 226 | #if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ | 228 | #if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ |
| 227 | if ((i == -1) && (err == 0)) | 229 | if ((i == -1) && (err == 0)) |
| 228 | return(1); | 230 | return (1); |
| 229 | #endif | 231 | #endif |
| 230 | 232 | ||
| 231 | return(BIO_sock_non_fatal_error(err)); | 233 | return (BIO_sock_non_fatal_error(err)); |
| 232 | } | ||
| 233 | return(0); | ||
| 234 | } | 234 | } |
| 235 | return (0); | ||
| 236 | } | ||
| 235 | 237 | ||
| 236 | int BIO_sock_non_fatal_error(int err) | 238 | int |
| 237 | { | 239 | BIO_sock_non_fatal_error(int err) |
| 238 | switch (err) | 240 | { |
| 239 | { | 241 | switch (err) { |
| 240 | #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_NETWARE) | 242 | #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_NETWARE) |
| 241 | # if defined(WSAEWOULDBLOCK) | 243 | # if defined(WSAEWOULDBLOCK) |
| 242 | case WSAEWOULDBLOCK: | 244 | case WSAEWOULDBLOCK: |
| @@ -284,12 +286,12 @@ int BIO_sock_non_fatal_error(int err) | |||
| 284 | #ifdef EALREADY | 286 | #ifdef EALREADY |
| 285 | case EALREADY: | 287 | case EALREADY: |
| 286 | #endif | 288 | #endif |
| 287 | return(1); | 289 | return (1); |
| 288 | /* break; */ | 290 | /* break; */ |
| 289 | default: | 291 | default: |
| 290 | break; | 292 | break; |
| 291 | } | ||
| 292 | return(0); | ||
| 293 | } | 293 | } |
| 294 | return (0); | ||
| 295 | } | ||
| 294 | 296 | ||
| 295 | #endif /* #ifndef OPENSSL_NO_SOCK */ | 297 | #endif /* #ifndef OPENSSL_NO_SOCK */ |
diff --git a/src/lib/libssl/src/crypto/bio/b_dump.c b/src/lib/libssl/src/crypto/bio/b_dump.c index 492ee09275..bea94969a2 100644 --- a/src/lib/libssl/src/crypto/bio/b_dump.c +++ b/src/lib/libssl/src/crypto/bio/b_dump.c | |||
| @@ -66,122 +66,125 @@ | |||
| 66 | 66 | ||
| 67 | #define TRUNCATE | 67 | #define TRUNCATE |
| 68 | #define DUMP_WIDTH 16 | 68 | #define DUMP_WIDTH 16 |
| 69 | #define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH-((i-(i>6?6:i)+3)/4)) | 69 | #define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH - ((i - (i > 6 ? 6 : i) + 3) / 4)) |
| 70 | 70 | ||
| 71 | int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), | 71 | int |
| 72 | void *u, const char *s, int len) | 72 | BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), |
| 73 | { | 73 | void *u, const char *s, int len) |
| 74 | { | ||
| 74 | return BIO_dump_indent_cb(cb, u, s, len, 0); | 75 | return BIO_dump_indent_cb(cb, u, s, len, 0); |
| 75 | } | 76 | } |
| 76 | 77 | ||
| 77 | int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), | 78 | int |
| 78 | void *u, const char *s, int len, int indent) | 79 | BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), |
| 79 | { | 80 | void *u, const char *s, int len, int indent) |
| 80 | int ret=0; | 81 | { |
| 81 | char buf[288+1],tmp[20],str[128+1]; | 82 | int ret = 0; |
| 82 | int i,j,rows,trc; | 83 | char buf[288 + 1], tmp[20], str[128 + 1]; |
| 84 | int i, j, rows, trc; | ||
| 83 | unsigned char ch; | 85 | unsigned char ch; |
| 84 | int dump_width; | 86 | int dump_width; |
| 85 | 87 | ||
| 86 | trc=0; | 88 | trc = 0; |
| 87 | 89 | ||
| 88 | #ifdef TRUNCATE | 90 | #ifdef TRUNCATE |
| 89 | for(; (len > 0) && ((s[len-1] == ' ') || (s[len-1] == '\0')); len--) | 91 | for (; (len > 0) && ((s[len - 1] == ' ') || (s[len - 1] == '\0')); len--) |
| 90 | trc++; | 92 | trc++; |
| 91 | #endif | 93 | #endif |
| 92 | 94 | ||
| 93 | if (indent < 0) | 95 | if (indent < 0) |
| 94 | indent = 0; | 96 | indent = 0; |
| 95 | if (indent) | 97 | if (indent) { |
| 96 | { | 98 | if (indent > 128) |
| 97 | if (indent > 128) indent=128; | 99 | indent = 128; |
| 98 | memset(str,' ',indent); | 100 | memset(str, ' ', indent); |
| 99 | } | 101 | } |
| 100 | str[indent]='\0'; | 102 | str[indent] = '\0'; |
| 101 | 103 | ||
| 102 | dump_width=DUMP_WIDTH_LESS_INDENT(indent); | 104 | dump_width = DUMP_WIDTH_LESS_INDENT(indent); |
| 103 | rows=(len/dump_width); | 105 | rows = (len / dump_width); |
| 104 | if ((rows*dump_width)<len) | 106 | if ((rows * dump_width) < len) |
| 105 | rows++; | 107 | rows++; |
| 106 | for(i=0;i<rows;i++) | 108 | for (i = 0; i < rows; i++) { |
| 107 | { | 109 | buf[0] = '\0'; /* start with empty string */ |
| 108 | buf[0]='\0'; /* start with empty string */ | 110 | BUF_strlcpy(buf, str, sizeof buf); |
| 109 | BUF_strlcpy(buf,str,sizeof buf); | 111 | (void) snprintf(tmp, sizeof tmp, "%04x - ", i*dump_width); |
| 110 | (void) snprintf(tmp,sizeof tmp,"%04x - ",i*dump_width); | 112 | BUF_strlcat(buf, tmp, sizeof buf); |
| 111 | BUF_strlcat(buf,tmp,sizeof buf); | 113 | for (j = 0; j < dump_width; j++) { |
| 112 | for(j=0;j<dump_width;j++) | 114 | if (((i*dump_width) + j) >= len) { |
| 113 | { | 115 | BUF_strlcat(buf, " ", sizeof buf); |
| 114 | if (((i*dump_width)+j)>=len) | 116 | } else { |
| 115 | { | 117 | ch = ((unsigned char)*(s + i*dump_width + j)) & 0xff; |
| 116 | BUF_strlcat(buf," ",sizeof buf); | 118 | (void) snprintf(tmp, sizeof tmp, "%02x%c", ch, |
| 117 | } | 119 | j == 7 ? '-' : ' '); |
| 118 | else | 120 | BUF_strlcat(buf, tmp, sizeof buf); |
| 119 | { | ||
| 120 | ch=((unsigned char)*(s+i*dump_width+j)) & 0xff; | ||
| 121 | (void) snprintf(tmp,sizeof tmp,"%02x%c",ch, | ||
| 122 | j==7?'-':' '); | ||
| 123 | BUF_strlcat(buf,tmp,sizeof buf); | ||
| 124 | } | ||
| 125 | } | 121 | } |
| 126 | BUF_strlcat(buf," ",sizeof buf); | 122 | } |
| 127 | for(j=0;j<dump_width;j++) | 123 | BUF_strlcat(buf, " ", sizeof buf); |
| 128 | { | 124 | for (j = 0; j < dump_width; j++) { |
| 129 | if (((i*dump_width)+j)>=len) | 125 | if (((i*dump_width) + j) >= len) |
| 130 | break; | 126 | break; |
| 131 | ch=((unsigned char)*(s+i*dump_width+j)) & 0xff; | 127 | ch = ((unsigned char)*(s + i * dump_width + j)) & 0xff; |
| 132 | #ifndef CHARSET_EBCDIC | 128 | #ifndef CHARSET_EBCDIC |
| 133 | (void) snprintf(tmp,sizeof tmp,"%c", | 129 | (void) snprintf(tmp, sizeof tmp, "%c", |
| 134 | ((ch>=' ')&&(ch<='~'))?ch:'.'); | 130 | ((ch >= ' ') && (ch <= '~')) ? ch : '.'); |
| 135 | #else | 131 | #else |
| 136 | (void) snprintf(tmp,sizeof tmp,"%c", | 132 | (void) snprintf(tmp, sizeof tmp, "%c", |
| 137 | ((ch>=os_toascii[' '])&&(ch<=os_toascii['~'])) | 133 | ((ch >= os_toascii[' ']) && (ch <= os_toascii['~'])) |
| 138 | ? os_toebcdic[ch] | 134 | ? os_toebcdic[ch] : '.'); |
| 139 | : '.'); | ||
| 140 | #endif | 135 | #endif |
| 141 | BUF_strlcat(buf,tmp,sizeof buf); | 136 | BUF_strlcat(buf, tmp, sizeof buf); |
| 142 | } | 137 | } |
| 143 | BUF_strlcat(buf,"\n",sizeof buf); | 138 | BUF_strlcat(buf, "\n", sizeof buf); |
| 144 | /* if this is the last call then update the ddt_dump thing so | 139 | /* if this is the last call then update the ddt_dump thing so |
| 145 | * that we will move the selection point in the debug window | 140 | * that we will move the selection point in the debug window |
| 146 | */ | 141 | */ |
| 147 | ret+=cb((void *)buf,strlen(buf),u); | 142 | ret += cb((void *)buf, strlen(buf), u); |
| 148 | } | 143 | } |
| 149 | #ifdef TRUNCATE | 144 | #ifdef TRUNCATE |
| 150 | if (trc > 0) | 145 | if (trc > 0) { |
| 151 | { | 146 | (void) snprintf(buf, sizeof buf, "%s%04x - <SPACES/NULS>\n", |
| 152 | (void) snprintf(buf,sizeof buf,"%s%04x - <SPACES/NULS>\n",str, | 147 | str, len + trc); |
| 153 | len+trc); | 148 | ret += cb((void *)buf, strlen(buf), u); |
| 154 | ret+=cb((void *)buf,strlen(buf),u); | ||
| 155 | } | ||
| 156 | #endif | ||
| 157 | return(ret); | ||
| 158 | } | 149 | } |
| 150 | #endif | ||
| 151 | return (ret); | ||
| 152 | } | ||
| 159 | 153 | ||
| 160 | #ifndef OPENSSL_NO_FP_API | 154 | #ifndef OPENSSL_NO_FP_API |
| 161 | static int write_fp(const void *data, size_t len, void *fp) | 155 | static int |
| 162 | { | 156 | write_fp(const void *data, size_t len, void *fp) |
| 157 | { | ||
| 163 | return UP_fwrite(data, len, 1, fp); | 158 | return UP_fwrite(data, len, 1, fp); |
| 164 | } | 159 | } |
| 165 | int BIO_dump_fp(FILE *fp, const char *s, int len) | 160 | |
| 166 | { | 161 | int |
| 162 | BIO_dump_fp(FILE *fp, const char *s, int len) | ||
| 163 | { | ||
| 167 | return BIO_dump_cb(write_fp, fp, s, len); | 164 | return BIO_dump_cb(write_fp, fp, s, len); |
| 168 | } | 165 | } |
| 169 | int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent) | 166 | |
| 170 | { | 167 | int |
| 168 | BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent) | ||
| 169 | { | ||
| 171 | return BIO_dump_indent_cb(write_fp, fp, s, len, indent); | 170 | return BIO_dump_indent_cb(write_fp, fp, s, len, indent); |
| 172 | } | 171 | } |
| 173 | #endif | 172 | #endif |
| 174 | 173 | ||
| 175 | static int write_bio(const void *data, size_t len, void *bp) | 174 | static int |
| 176 | { | 175 | write_bio(const void *data, size_t len, void *bp) |
| 176 | { | ||
| 177 | return BIO_write((BIO *)bp, (const char *)data, len); | 177 | return BIO_write((BIO *)bp, (const char *)data, len); |
| 178 | } | 178 | } |
| 179 | int BIO_dump(BIO *bp, const char *s, int len) | 179 | |
| 180 | { | 180 | int |
| 181 | BIO_dump(BIO *bp, const char *s, int len) | ||
| 182 | { | ||
| 181 | return BIO_dump_cb(write_bio, bp, s, len); | 183 | return BIO_dump_cb(write_bio, bp, s, len); |
| 182 | } | 184 | } |
| 183 | int BIO_dump_indent(BIO *bp, const char *s, int len, int indent) | ||
| 184 | { | ||
| 185 | return BIO_dump_indent_cb(write_bio, bp, s, len, indent); | ||
| 186 | } | ||
| 187 | 185 | ||
| 186 | int | ||
| 187 | BIO_dump_indent(BIO *bp, const char *s, int len, int indent) | ||
| 188 | { | ||
| 189 | return BIO_dump_indent_cb(write_bio, bp, s, len, indent); | ||
| 190 | } | ||
diff --git a/src/lib/libssl/src/crypto/bio/b_print.c b/src/lib/libssl/src/crypto/bio/b_print.c index 143a7cfefa..b3b0d45ee6 100644 --- a/src/lib/libssl/src/crypto/bio/b_print.c +++ b/src/lib/libssl/src/crypto/bio/b_print.c | |||
| @@ -125,16 +125,15 @@ | |||
| 125 | #define LLONG long | 125 | #define LLONG long |
| 126 | #endif | 126 | #endif |
| 127 | 127 | ||
| 128 | static void fmtstr (char **, char **, size_t *, size_t *, | 128 | static void fmtstr(char **, char **, size_t *, size_t *, const char *, |
| 129 | const char *, int, int, int); | 129 | int, int, int); |
| 130 | static void fmtint (char **, char **, size_t *, size_t *, | 130 | static void fmtint(char **, char **, size_t *, size_t *, LLONG, int, |
| 131 | LLONG, int, int, int, int); | 131 | int, int, int); |
| 132 | static void fmtfp (char **, char **, size_t *, size_t *, | 132 | static void fmtfp(char **, char **, size_t *, size_t *, LDOUBLE, |
| 133 | LDOUBLE, int, int, int); | 133 | int, int, int); |
| 134 | static void doapr_outch (char **, char **, size_t *, size_t *, int); | 134 | static void doapr_outch(char **, char **, size_t *, size_t *, int); |
| 135 | static void _dopr(char **sbuffer, char **buffer, | 135 | static void _dopr(char **sbuffer, char **buffer, size_t *maxlen, |
| 136 | size_t *maxlen, size_t *retlen, int *truncated, | 136 | size_t *retlen, int *truncated, const char *format, va_list args); |
| 137 | const char *format, va_list args); | ||
| 138 | 137 | ||
| 139 | /* format read states */ | 138 | /* format read states */ |
| 140 | #define DP_S_DEFAULT 0 | 139 | #define DP_S_DEFAULT 0 |
| @@ -166,607 +165,576 @@ static void _dopr(char **sbuffer, char **buffer, | |||
| 166 | #define OSSL_MAX(p,q) ((p >= q) ? p : q) | 165 | #define OSSL_MAX(p,q) ((p >= q) ? p : q) |
| 167 | 166 | ||
| 168 | static void | 167 | static void |
| 169 | _dopr( | 168 | _dopr(char **sbuffer, char **buffer, size_t *maxlen, size_t *retlen, |
| 170 | char **sbuffer, | 169 | int *truncated, const char *format, va_list args) |
| 171 | char **buffer, | ||
| 172 | size_t *maxlen, | ||
| 173 | size_t *retlen, | ||
| 174 | int *truncated, | ||
| 175 | const char *format, | ||
| 176 | va_list args) | ||
| 177 | { | 170 | { |
| 178 | char ch; | 171 | char ch; |
| 179 | LLONG value; | 172 | LLONG value; |
| 180 | LDOUBLE fvalue; | 173 | LDOUBLE fvalue; |
| 181 | char *strvalue; | 174 | char *strvalue; |
| 182 | int min; | 175 | int min; |
| 183 | int max; | 176 | int max; |
| 184 | int state; | 177 | int state; |
| 185 | int flags; | 178 | int flags; |
| 186 | int cflags; | 179 | int cflags; |
| 187 | size_t currlen; | 180 | size_t currlen; |
| 188 | 181 | ||
| 189 | state = DP_S_DEFAULT; | 182 | state = DP_S_DEFAULT; |
| 190 | flags = currlen = cflags = min = 0; | 183 | flags = currlen = cflags = min = 0; |
| 191 | max = -1; | 184 | max = -1; |
| 192 | ch = *format++; | 185 | ch = *format++; |
| 193 | 186 | ||
| 194 | while (state != DP_S_DONE) { | 187 | while (state != DP_S_DONE) { |
| 195 | if (ch == '\0' || (buffer == NULL && currlen >= *maxlen)) | 188 | if (ch == '\0' || (buffer == NULL && currlen >= *maxlen)) |
| 196 | state = DP_S_DONE; | 189 | state = DP_S_DONE; |
| 197 | 190 | ||
| 198 | switch (state) { | 191 | switch (state) { |
| 199 | case DP_S_DEFAULT: | 192 | case DP_S_DEFAULT: |
| 200 | if (ch == '%') | 193 | if (ch == '%') |
| 201 | state = DP_S_FLAGS; | 194 | state = DP_S_FLAGS; |
| 202 | else | 195 | else |
| 203 | doapr_outch(sbuffer,buffer, &currlen, maxlen, ch); | 196 | doapr_outch(sbuffer, buffer, &currlen, maxlen, ch); |
| 204 | ch = *format++; | 197 | ch = *format++; |
| 205 | break; | 198 | break; |
| 206 | case DP_S_FLAGS: | 199 | case DP_S_FLAGS: |
| 207 | switch (ch) { | 200 | switch (ch) { |
| 208 | case '-': | 201 | case '-': |
| 209 | flags |= DP_F_MINUS; | 202 | flags |= DP_F_MINUS; |
| 210 | ch = *format++; | 203 | ch = *format++; |
| 211 | break; | 204 | break; |
| 212 | case '+': | 205 | case '+': |
| 213 | flags |= DP_F_PLUS; | 206 | flags |= DP_F_PLUS; |
| 214 | ch = *format++; | 207 | ch = *format++; |
| 215 | break; | 208 | break; |
| 216 | case ' ': | 209 | case ' ': |
| 217 | flags |= DP_F_SPACE; | 210 | flags |= DP_F_SPACE; |
| 218 | ch = *format++; | 211 | ch = *format++; |
| 219 | break; | 212 | break; |
| 220 | case '#': | 213 | case '#': |
| 221 | flags |= DP_F_NUM; | 214 | flags |= DP_F_NUM; |
| 222 | ch = *format++; | 215 | ch = *format++; |
| 223 | break; | 216 | break; |
| 224 | case '0': | 217 | case '0': |
| 225 | flags |= DP_F_ZERO; | 218 | flags |= DP_F_ZERO; |
| 226 | ch = *format++; | 219 | ch = *format++; |
| 227 | break; | 220 | break; |
| 228 | default: | 221 | default: |
| 229 | state = DP_S_MIN; | 222 | state = DP_S_MIN; |
| 230 | break; | 223 | break; |
| 231 | } | 224 | } |
| 232 | break; | 225 | break; |
| 233 | case DP_S_MIN: | 226 | case DP_S_MIN: |
| 234 | if (isdigit((unsigned char)ch)) { | 227 | if (isdigit((unsigned char)ch)) { |
| 235 | min = 10 * min + char_to_int(ch); | 228 | min = 10 * min + char_to_int(ch); |
| 236 | ch = *format++; | 229 | ch = *format++; |
| 237 | } else if (ch == '*') { | 230 | } else if (ch == '*') { |
| 238 | min = va_arg(args, int); | 231 | min = va_arg(args, int); |
| 239 | ch = *format++; | 232 | ch = *format++; |
| 240 | state = DP_S_DOT; | 233 | state = DP_S_DOT; |
| 241 | } else | 234 | } else |
| 242 | state = DP_S_DOT; | 235 | state = DP_S_DOT; |
| 243 | break; | 236 | break; |
| 244 | case DP_S_DOT: | 237 | case DP_S_DOT: |
| 245 | if (ch == '.') { | 238 | if (ch == '.') { |
| 246 | state = DP_S_MAX; | 239 | state = DP_S_MAX; |
| 247 | ch = *format++; | 240 | ch = *format++; |
| 248 | } else | 241 | } else |
| 249 | state = DP_S_MOD; | 242 | state = DP_S_MOD; |
| 250 | break; | 243 | break; |
| 251 | case DP_S_MAX: | 244 | case DP_S_MAX: |
| 252 | if (isdigit((unsigned char)ch)) { | 245 | if (isdigit((unsigned char)ch)) { |
| 253 | if (max < 0) | 246 | if (max < 0) |
| 254 | max = 0; | 247 | max = 0; |
| 255 | max = 10 * max + char_to_int(ch); | 248 | max = 10 * max + char_to_int(ch); |
| 256 | ch = *format++; | 249 | ch = *format++; |
| 257 | } else if (ch == '*') { | 250 | } else if (ch == '*') { |
| 258 | max = va_arg(args, int); | 251 | max = va_arg(args, int); |
| 259 | ch = *format++; | 252 | ch = *format++; |
| 260 | state = DP_S_MOD; | 253 | state = DP_S_MOD; |
| 261 | } else | 254 | } else |
| 262 | state = DP_S_MOD; | 255 | state = DP_S_MOD; |
| 263 | break; | 256 | break; |
| 264 | case DP_S_MOD: | 257 | case DP_S_MOD: |
| 265 | switch (ch) { | 258 | switch (ch) { |
| 266 | case 'h': | 259 | case 'h': |
| 267 | cflags = DP_C_SHORT; | 260 | cflags = DP_C_SHORT; |
| 268 | ch = *format++; | 261 | ch = *format++; |
| 269 | break; | 262 | break; |
| 270 | case 'l': | 263 | case 'l': |
| 271 | if (*format == 'l') { | 264 | if (*format == 'l') { |
| 272 | cflags = DP_C_LLONG; | 265 | cflags = DP_C_LLONG; |
| 273 | format++; | 266 | format++; |
| 274 | } else | 267 | } else |
| 275 | cflags = DP_C_LONG; | 268 | cflags = DP_C_LONG; |
| 276 | ch = *format++; | 269 | ch = *format++; |
| 277 | break; | 270 | break; |
| 278 | case 'q': | 271 | case 'q': |
| 279 | cflags = DP_C_LLONG; | 272 | cflags = DP_C_LLONG; |
| 280 | ch = *format++; | 273 | ch = *format++; |
| 281 | break; | 274 | break; |
| 282 | case 'L': | 275 | case 'L': |
| 283 | cflags = DP_C_LDOUBLE; | 276 | cflags = DP_C_LDOUBLE; |
| 284 | ch = *format++; | 277 | ch = *format++; |
| 285 | break; | 278 | break; |
| 286 | default: | 279 | default: |
| 287 | break; | 280 | break; |
| 288 | } | 281 | } |
| 289 | state = DP_S_CONV; | 282 | state = DP_S_CONV; |
| 290 | break; | 283 | break; |
| 291 | case DP_S_CONV: | 284 | case DP_S_CONV: |
| 292 | switch (ch) { | 285 | switch (ch) { |
| 293 | case 'd': | 286 | case 'd': |
| 294 | case 'i': | 287 | case 'i': |
| 295 | switch (cflags) { | 288 | switch (cflags) { |
| 296 | case DP_C_SHORT: | 289 | case DP_C_SHORT: |
| 297 | value = (short int)va_arg(args, int); | 290 | value = (short int)va_arg(args, int); |
| 298 | break; | 291 | break; |
| 299 | case DP_C_LONG: | 292 | case DP_C_LONG: |
| 300 | value = va_arg(args, long int); | 293 | value = va_arg(args, long int); |
| 301 | break; | 294 | break; |
| 302 | case DP_C_LLONG: | 295 | case DP_C_LLONG: |
| 303 | value = va_arg(args, LLONG); | 296 | value = va_arg(args, LLONG); |
| 304 | break; | 297 | break; |
| 305 | default: | 298 | default: |
| 306 | value = va_arg(args, int); | 299 | value = va_arg(args, int); |
| 307 | break; | 300 | break; |
| 308 | } | 301 | } |
| 309 | fmtint(sbuffer, buffer, &currlen, maxlen, | 302 | fmtint(sbuffer, buffer, &currlen, maxlen, |
| 310 | value, 10, min, max, flags); | 303 | value, 10, min, max, flags); |
| 311 | break; | 304 | break; |
| 312 | case 'X': | 305 | case 'X': |
| 313 | flags |= DP_F_UP; | 306 | flags |= DP_F_UP; |
| 314 | /* FALLTHROUGH */ | 307 | /* FALLTHROUGH */ |
| 315 | case 'x': | 308 | case 'x': |
| 316 | case 'o': | 309 | case 'o': |
| 317 | case 'u': | 310 | case 'u': |
| 318 | flags |= DP_F_UNSIGNED; | 311 | flags |= DP_F_UNSIGNED; |
| 319 | switch (cflags) { | 312 | switch (cflags) { |
| 320 | case DP_C_SHORT: | 313 | case DP_C_SHORT: |
| 321 | value = (unsigned short int)va_arg(args, unsigned int); | 314 | value = (unsigned short int)va_arg( |
| 322 | break; | 315 | args, unsigned int); |
| 323 | case DP_C_LONG: | 316 | break; |
| 324 | value = (LLONG) va_arg(args, | 317 | case DP_C_LONG: |
| 325 | unsigned long int); | 318 | value = (LLONG)va_arg(args, |
| 326 | break; | 319 | unsigned long int); |
| 327 | case DP_C_LLONG: | 320 | break; |
| 328 | value = va_arg(args, unsigned LLONG); | 321 | case DP_C_LLONG: |
| 329 | break; | 322 | value = va_arg(args, unsigned LLONG); |
| 330 | default: | 323 | break; |
| 331 | value = (LLONG) va_arg(args, | 324 | default: |
| 332 | unsigned int); | 325 | value = (LLONG)va_arg(args, |
| 333 | break; | 326 | unsigned int); |
| 334 | } | 327 | break; |
| 335 | fmtint(sbuffer, buffer, &currlen, maxlen, value, | 328 | } |
| 336 | ch == 'o' ? 8 : (ch == 'u' ? 10 : 16), | 329 | fmtint(sbuffer, buffer, &currlen, maxlen, value, |
| 337 | min, max, flags); | 330 | ch == 'o' ? 8 : (ch == 'u' ? 10 : 16), |
| 338 | break; | 331 | min, max, flags); |
| 339 | case 'f': | 332 | break; |
| 340 | if (cflags == DP_C_LDOUBLE) | 333 | case 'f': |
| 341 | fvalue = va_arg(args, LDOUBLE); | 334 | if (cflags == DP_C_LDOUBLE) |
| 342 | else | 335 | fvalue = va_arg(args, LDOUBLE); |
| 343 | fvalue = va_arg(args, double); | 336 | else |
| 344 | fmtfp(sbuffer, buffer, &currlen, maxlen, | 337 | fvalue = va_arg(args, double); |
| 345 | fvalue, min, max, flags); | 338 | fmtfp(sbuffer, buffer, &currlen, maxlen, |
| 346 | break; | 339 | fvalue, min, max, flags); |
| 347 | case 'E': | 340 | break; |
| 348 | flags |= DP_F_UP; | 341 | case 'E': |
| 349 | case 'e': | 342 | flags |= DP_F_UP; |
| 350 | if (cflags == DP_C_LDOUBLE) | 343 | case 'e': |
| 351 | fvalue = va_arg(args, LDOUBLE); | 344 | if (cflags == DP_C_LDOUBLE) |
| 352 | else | 345 | fvalue = va_arg(args, LDOUBLE); |
| 353 | fvalue = va_arg(args, double); | 346 | else |
| 354 | break; | 347 | fvalue = va_arg(args, double); |
| 355 | case 'G': | 348 | break; |
| 356 | flags |= DP_F_UP; | 349 | case 'G': |
| 357 | case 'g': | 350 | flags |= DP_F_UP; |
| 358 | if (cflags == DP_C_LDOUBLE) | 351 | case 'g': |
| 359 | fvalue = va_arg(args, LDOUBLE); | 352 | if (cflags == DP_C_LDOUBLE) |
| 360 | else | 353 | fvalue = va_arg(args, LDOUBLE); |
| 361 | fvalue = va_arg(args, double); | 354 | else |
| 362 | break; | 355 | fvalue = va_arg(args, double); |
| 363 | case 'c': | 356 | break; |
| 364 | doapr_outch(sbuffer, buffer, &currlen, maxlen, | 357 | case 'c': |
| 365 | va_arg(args, int)); | 358 | doapr_outch(sbuffer, buffer, &currlen, maxlen, |
| 366 | break; | 359 | va_arg(args, int)); |
| 367 | case 's': | 360 | break; |
| 368 | strvalue = va_arg(args, char *); | 361 | case 's': |
| 369 | if (max < 0) { | 362 | strvalue = va_arg(args, char *); |
| 370 | if (buffer) | 363 | if (max < 0) { |
| 371 | max = INT_MAX; | 364 | if (buffer) |
| 372 | else | 365 | max = INT_MAX; |
| 373 | max = *maxlen; | 366 | else |
| 367 | max = *maxlen; | ||
| 368 | } | ||
| 369 | fmtstr(sbuffer, buffer, &currlen, maxlen, | ||
| 370 | strvalue, flags, min, max); | ||
| 371 | break; | ||
| 372 | case 'p': | ||
| 373 | value = (long)va_arg(args, void *); | ||
| 374 | fmtint(sbuffer, buffer, &currlen, maxlen, | ||
| 375 | value, 16, min, max, flags|DP_F_NUM); | ||
| 376 | break; | ||
| 377 | case 'n': /* XXX */ | ||
| 378 | if (cflags == DP_C_SHORT) { | ||
| 379 | short int *num; | ||
| 380 | num = va_arg(args, short int *); | ||
| 381 | *num = currlen; | ||
| 382 | } else if (cflags == DP_C_LONG) { /* XXX */ | ||
| 383 | long int *num; | ||
| 384 | num = va_arg(args, long int *); | ||
| 385 | *num = (long int) currlen; | ||
| 386 | } else if (cflags == DP_C_LLONG) { /* XXX */ | ||
| 387 | LLONG *num; | ||
| 388 | num = va_arg(args, LLONG *); | ||
| 389 | *num = (LLONG) currlen; | ||
| 390 | } else { | ||
| 391 | int *num; | ||
| 392 | num = va_arg(args, int *); | ||
| 393 | *num = currlen; | ||
| 394 | } | ||
| 395 | break; | ||
| 396 | case '%': | ||
| 397 | doapr_outch(sbuffer, buffer, &currlen, maxlen, ch); | ||
| 398 | break; | ||
| 399 | case 'w': | ||
| 400 | /* not supported yet, treat as next char */ | ||
| 401 | ch = *format++; | ||
| 402 | break; | ||
| 403 | default: | ||
| 404 | /* unknown, skip */ | ||
| 405 | break; | ||
| 406 | } | ||
| 407 | ch = *format++; | ||
| 408 | state = DP_S_DEFAULT; | ||
| 409 | flags = cflags = min = 0; | ||
| 410 | max = -1; | ||
| 411 | break; | ||
| 412 | case DP_S_DONE: | ||
| 413 | break; | ||
| 414 | default: | ||
| 415 | break; | ||
| 374 | } | 416 | } |
| 375 | fmtstr(sbuffer, buffer, &currlen, maxlen, strvalue, | 417 | } |
| 376 | flags, min, max); | 418 | *truncated = (currlen > *maxlen - 1); |
| 377 | break; | 419 | if (*truncated) |
| 378 | case 'p': | 420 | currlen = *maxlen - 1; |
| 379 | value = (long)va_arg(args, void *); | 421 | doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0'); |
| 380 | fmtint(sbuffer, buffer, &currlen, maxlen, | 422 | *retlen = currlen - 1; |
| 381 | value, 16, min, max, flags|DP_F_NUM); | 423 | return; |
| 382 | break; | ||
| 383 | case 'n': /* XXX */ | ||
| 384 | if (cflags == DP_C_SHORT) { | ||
| 385 | short int *num; | ||
| 386 | num = va_arg(args, short int *); | ||
| 387 | *num = currlen; | ||
| 388 | } else if (cflags == DP_C_LONG) { /* XXX */ | ||
| 389 | long int *num; | ||
| 390 | num = va_arg(args, long int *); | ||
| 391 | *num = (long int) currlen; | ||
| 392 | } else if (cflags == DP_C_LLONG) { /* XXX */ | ||
| 393 | LLONG *num; | ||
| 394 | num = va_arg(args, LLONG *); | ||
| 395 | *num = (LLONG) currlen; | ||
| 396 | } else { | ||
| 397 | int *num; | ||
| 398 | num = va_arg(args, int *); | ||
| 399 | *num = currlen; | ||
| 400 | } | ||
| 401 | break; | ||
| 402 | case '%': | ||
| 403 | doapr_outch(sbuffer, buffer, &currlen, maxlen, ch); | ||
| 404 | break; | ||
| 405 | case 'w': | ||
| 406 | /* not supported yet, treat as next char */ | ||
| 407 | ch = *format++; | ||
| 408 | break; | ||
| 409 | default: | ||
| 410 | /* unknown, skip */ | ||
| 411 | break; | ||
| 412 | } | ||
| 413 | ch = *format++; | ||
| 414 | state = DP_S_DEFAULT; | ||
| 415 | flags = cflags = min = 0; | ||
| 416 | max = -1; | ||
| 417 | break; | ||
| 418 | case DP_S_DONE: | ||
| 419 | break; | ||
| 420 | default: | ||
| 421 | break; | ||
| 422 | } | ||
| 423 | } | ||
| 424 | *truncated = (currlen > *maxlen - 1); | ||
| 425 | if (*truncated) | ||
| 426 | currlen = *maxlen - 1; | ||
| 427 | doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0'); | ||
| 428 | *retlen = currlen - 1; | ||
| 429 | return; | ||
| 430 | } | 424 | } |
| 431 | 425 | ||
| 432 | static void | 426 | static void |
| 433 | fmtstr( | 427 | fmtstr(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen, |
| 434 | char **sbuffer, | 428 | const char *value, int flags, int min, int max) |
| 435 | char **buffer, | ||
| 436 | size_t *currlen, | ||
| 437 | size_t *maxlen, | ||
| 438 | const char *value, | ||
| 439 | int flags, | ||
| 440 | int min, | ||
| 441 | int max) | ||
| 442 | { | 429 | { |
| 443 | int padlen, strln; | 430 | int padlen, strln; |
| 444 | int cnt = 0; | 431 | int cnt = 0; |
| 445 | 432 | ||
| 446 | if (value == 0) | 433 | if (value == 0) |
| 447 | value = "<NULL>"; | 434 | value = "<NULL>"; |
| 448 | for (strln = 0; value[strln]; ++strln) | 435 | for (strln = 0; value[strln]; ++strln) |
| 449 | ; | 436 | ; |
| 450 | padlen = min - strln; | 437 | padlen = min - strln; |
| 451 | if (padlen < 0) | 438 | if (padlen < 0) |
| 452 | padlen = 0; | 439 | padlen = 0; |
| 453 | if (flags & DP_F_MINUS) | 440 | if (flags & DP_F_MINUS) |
| 454 | padlen = -padlen; | 441 | padlen = -padlen; |
| 455 | 442 | ||
| 456 | while ((padlen > 0) && (cnt < max)) { | 443 | while ((padlen > 0) && (cnt < max)) { |
| 457 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | 444 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
| 458 | --padlen; | 445 | --padlen; |
| 459 | ++cnt; | 446 | ++cnt; |
| 460 | } | 447 | } |
| 461 | while (*value && (cnt < max)) { | 448 | while (*value && (cnt < max)) { |
| 462 | doapr_outch(sbuffer, buffer, currlen, maxlen, *value++); | 449 | doapr_outch(sbuffer, buffer, currlen, maxlen, *value++); |
| 463 | ++cnt; | 450 | ++cnt; |
| 464 | } | 451 | } |
| 465 | while ((padlen < 0) && (cnt < max)) { | 452 | while ((padlen < 0) && (cnt < max)) { |
| 466 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | 453 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
| 467 | ++padlen; | 454 | ++padlen; |
| 468 | ++cnt; | 455 | ++cnt; |
| 469 | } | 456 | } |
| 470 | } | 457 | } |
| 471 | 458 | ||
| 472 | static void | 459 | static void |
| 473 | fmtint( | 460 | fmtint(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen, |
| 474 | char **sbuffer, | 461 | LLONG value, int base, int min, int max, int flags) |
| 475 | char **buffer, | ||
| 476 | size_t *currlen, | ||
| 477 | size_t *maxlen, | ||
| 478 | LLONG value, | ||
| 479 | int base, | ||
| 480 | int min, | ||
| 481 | int max, | ||
| 482 | int flags) | ||
| 483 | { | 462 | { |
| 484 | int signvalue = 0; | 463 | int signvalue = 0; |
| 485 | const char *prefix = ""; | 464 | const char *prefix = ""; |
| 486 | unsigned LLONG uvalue; | 465 | unsigned LLONG uvalue; |
| 487 | char convert[DECIMAL_SIZE(value)+3]; | 466 | char convert[DECIMAL_SIZE(value) + 3]; |
| 488 | int place = 0; | 467 | int place = 0; |
| 489 | int spadlen = 0; | 468 | int spadlen = 0; |
| 490 | int zpadlen = 0; | 469 | int zpadlen = 0; |
| 491 | int caps = 0; | 470 | int caps = 0; |
| 492 | 471 | ||
| 493 | if (max < 0) | 472 | if (max < 0) |
| 494 | max = 0; | 473 | max = 0; |
| 495 | uvalue = value; | 474 | uvalue = value; |
| 496 | if (!(flags & DP_F_UNSIGNED)) { | 475 | if (!(flags & DP_F_UNSIGNED)) { |
| 497 | if (value < 0) { | 476 | if (value < 0) { |
| 498 | signvalue = '-'; | 477 | signvalue = '-'; |
| 499 | uvalue = -value; | 478 | uvalue = -value; |
| 500 | } else if (flags & DP_F_PLUS) | 479 | } else if (flags & DP_F_PLUS) |
| 501 | signvalue = '+'; | 480 | signvalue = '+'; |
| 502 | else if (flags & DP_F_SPACE) | 481 | else if (flags & DP_F_SPACE) |
| 503 | signvalue = ' '; | 482 | signvalue = ' '; |
| 504 | } | 483 | } |
| 505 | if (flags & DP_F_NUM) { | 484 | if (flags & DP_F_NUM) { |
| 506 | if (base == 8) prefix = "0"; | 485 | if (base == 8) |
| 507 | if (base == 16) prefix = "0x"; | 486 | prefix = "0"; |
| 508 | } | 487 | if (base == 16) |
| 509 | if (flags & DP_F_UP) | 488 | prefix = "0x"; |
| 510 | caps = 1; | 489 | } |
| 511 | do { | 490 | if (flags & DP_F_UP) |
| 512 | convert[place++] = | 491 | caps = 1; |
| 513 | (caps ? "0123456789ABCDEF" : "0123456789abcdef") | 492 | do { |
| 514 | [uvalue % (unsigned) base]; | 493 | convert[place++] = (caps ? "0123456789ABCDEF" : |
| 515 | uvalue = (uvalue / (unsigned) base); | 494 | "0123456789abcdef")[uvalue % (unsigned) base]; |
| 516 | } while (uvalue && (place < (int)sizeof(convert))); | 495 | uvalue = (uvalue / (unsigned) base); |
| 517 | if (place == sizeof(convert)) | 496 | } while (uvalue && (place < (int)sizeof(convert))); |
| 518 | place--; | 497 | if (place == sizeof(convert)) |
| 519 | convert[place] = 0; | 498 | place--; |
| 520 | 499 | convert[place] = 0; | |
| 521 | zpadlen = max - place; | 500 | |
| 522 | spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0) - strlen(prefix); | 501 | zpadlen = max - place; |
| 523 | if (zpadlen < 0) | 502 | spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0) - |
| 524 | zpadlen = 0; | 503 | strlen(prefix); |
| 525 | if (spadlen < 0) | 504 | if (zpadlen < 0) |
| 526 | spadlen = 0; | 505 | zpadlen = 0; |
| 527 | if (flags & DP_F_ZERO) { | 506 | if (spadlen < 0) |
| 528 | zpadlen = OSSL_MAX(zpadlen, spadlen); | 507 | spadlen = 0; |
| 529 | spadlen = 0; | 508 | if (flags & DP_F_ZERO) { |
| 530 | } | 509 | zpadlen = OSSL_MAX(zpadlen, spadlen); |
| 531 | if (flags & DP_F_MINUS) | 510 | spadlen = 0; |
| 532 | spadlen = -spadlen; | 511 | } |
| 533 | 512 | if (flags & DP_F_MINUS) | |
| 534 | /* spaces */ | 513 | spadlen = -spadlen; |
| 535 | while (spadlen > 0) { | 514 | |
| 536 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | 515 | /* spaces */ |
| 537 | --spadlen; | 516 | while (spadlen > 0) { |
| 538 | } | 517 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
| 539 | 518 | --spadlen; | |
| 540 | /* sign */ | 519 | } |
| 541 | if (signvalue) | 520 | |
| 542 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); | 521 | /* sign */ |
| 543 | 522 | if (signvalue) | |
| 544 | /* prefix */ | 523 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); |
| 545 | while (*prefix) { | 524 | |
| 546 | doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix); | 525 | /* prefix */ |
| 547 | prefix++; | 526 | while (*prefix) { |
| 548 | } | 527 | doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix); |
| 549 | 528 | prefix++; | |
| 550 | /* zeros */ | 529 | } |
| 551 | if (zpadlen > 0) { | 530 | |
| 552 | while (zpadlen > 0) { | 531 | /* zeros */ |
| 553 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); | 532 | if (zpadlen > 0) { |
| 554 | --zpadlen; | 533 | while (zpadlen > 0) { |
| 555 | } | 534 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); |
| 556 | } | 535 | --zpadlen; |
| 557 | /* digits */ | 536 | } |
| 558 | while (place > 0) | 537 | } |
| 559 | doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]); | 538 | /* digits */ |
| 560 | 539 | while (place > 0) | |
| 561 | /* left justified spaces */ | 540 | doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]); |
| 562 | while (spadlen < 0) { | 541 | |
| 563 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | 542 | /* left justified spaces */ |
| 564 | ++spadlen; | 543 | while (spadlen < 0) { |
| 565 | } | 544 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
| 566 | return; | 545 | ++spadlen; |
| 546 | } | ||
| 547 | return; | ||
| 567 | } | 548 | } |
| 568 | 549 | ||
| 569 | static LDOUBLE | 550 | static LDOUBLE |
| 570 | abs_val(LDOUBLE value) | 551 | abs_val(LDOUBLE value) |
| 571 | { | 552 | { |
| 572 | LDOUBLE result = value; | 553 | LDOUBLE result = value; |
| 573 | if (value < 0) | 554 | if (value < 0) |
| 574 | result = -value; | 555 | result = -value; |
| 575 | return result; | 556 | return result; |
| 576 | } | 557 | } |
| 577 | 558 | ||
| 578 | static LDOUBLE | 559 | static LDOUBLE |
| 579 | pow_10(int in_exp) | 560 | pow_10(int in_exp) |
| 580 | { | 561 | { |
| 581 | LDOUBLE result = 1; | 562 | LDOUBLE result = 1; |
| 582 | while (in_exp) { | 563 | while (in_exp) { |
| 583 | result *= 10; | 564 | result *= 10; |
| 584 | in_exp--; | 565 | in_exp--; |
| 585 | } | 566 | } |
| 586 | return result; | 567 | return result; |
| 587 | } | 568 | } |
| 588 | 569 | ||
| 589 | static long | 570 | static long |
| 590 | roundv(LDOUBLE value) | 571 | roundv(LDOUBLE value) |
| 591 | { | 572 | { |
| 592 | long intpart; | 573 | long intpart; |
| 593 | intpart = (long) value; | 574 | intpart = (long) value; |
| 594 | value = value - intpart; | 575 | value = value - intpart; |
| 595 | if (value >= 0.5) | 576 | if (value >= 0.5) |
| 596 | intpart++; | 577 | intpart++; |
| 597 | return intpart; | 578 | return intpart; |
| 598 | } | 579 | } |
| 599 | 580 | ||
| 600 | static void | 581 | static void |
| 601 | fmtfp( | 582 | fmtfp(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen, |
| 602 | char **sbuffer, | 583 | LDOUBLE fvalue, int min, int max, int flags) |
| 603 | char **buffer, | ||
| 604 | size_t *currlen, | ||
| 605 | size_t *maxlen, | ||
| 606 | LDOUBLE fvalue, | ||
| 607 | int min, | ||
| 608 | int max, | ||
| 609 | int flags) | ||
| 610 | { | 584 | { |
| 611 | int signvalue = 0; | 585 | int signvalue = 0; |
| 612 | LDOUBLE ufvalue; | 586 | LDOUBLE ufvalue; |
| 613 | char iconvert[20]; | 587 | char iconvert[20]; |
| 614 | char fconvert[20]; | 588 | char fconvert[20]; |
| 615 | int iplace = 0; | 589 | int iplace = 0; |
| 616 | int fplace = 0; | 590 | int fplace = 0; |
| 617 | int padlen = 0; | 591 | int padlen = 0; |
| 618 | int zpadlen = 0; | 592 | int zpadlen = 0; |
| 619 | int caps = 0; | 593 | int caps = 0; |
| 620 | long intpart; | 594 | long intpart; |
| 621 | long fracpart; | 595 | long fracpart; |
| 622 | long max10; | 596 | long max10; |
| 623 | 597 | ||
| 624 | if (max < 0) | 598 | if (max < 0) |
| 625 | max = 6; | 599 | max = 6; |
| 626 | ufvalue = abs_val(fvalue); | 600 | ufvalue = abs_val(fvalue); |
| 627 | if (fvalue < 0) | 601 | if (fvalue < 0) |
| 628 | signvalue = '-'; | 602 | signvalue = '-'; |
| 629 | else if (flags & DP_F_PLUS) | 603 | else if (flags & DP_F_PLUS) |
| 630 | signvalue = '+'; | 604 | signvalue = '+'; |
| 631 | else if (flags & DP_F_SPACE) | 605 | else if (flags & DP_F_SPACE) |
| 632 | signvalue = ' '; | 606 | signvalue = ' '; |
| 633 | 607 | ||
| 634 | intpart = (long)ufvalue; | 608 | intpart = (long)ufvalue; |
| 635 | 609 | ||
| 636 | /* sorry, we only support 9 digits past the decimal because of our | 610 | /* sorry, we only support 9 digits past the decimal because of our |
| 637 | conversion method */ | 611 | conversion method */ |
| 638 | if (max > 9) | 612 | if (max > 9) |
| 639 | max = 9; | 613 | max = 9; |
| 640 | 614 | ||
| 641 | /* we "cheat" by converting the fractional part to integer by | 615 | /* we "cheat" by converting the fractional part to integer by |
| 642 | multiplying by a factor of 10 */ | 616 | multiplying by a factor of 10 */ |
| 643 | max10 = roundv(pow_10(max)); | 617 | max10 = roundv(pow_10(max)); |
| 644 | fracpart = roundv(pow_10(max) * (ufvalue - intpart)); | 618 | fracpart = roundv(pow_10(max) * (ufvalue - intpart)); |
| 645 | 619 | ||
| 646 | if (fracpart >= max10) { | 620 | if (fracpart >= max10) { |
| 647 | intpart++; | 621 | intpart++; |
| 648 | fracpart -= max10; | 622 | fracpart -= max10; |
| 649 | } | 623 | } |
| 650 | 624 | ||
| 651 | /* convert integer part */ | 625 | /* convert integer part */ |
| 652 | do { | 626 | do { |
| 653 | iconvert[iplace++] = | 627 | iconvert[iplace++] = (caps ? "0123456789ABCDEF" : |
| 654 | (caps ? "0123456789ABCDEF" | 628 | "0123456789abcdef")[intpart % 10]; |
| 655 | : "0123456789abcdef")[intpart % 10]; | 629 | intpart = (intpart / 10); |
| 656 | intpart = (intpart / 10); | 630 | } while (intpart && (iplace < (int)sizeof(iconvert))); |
| 657 | } while (intpart && (iplace < (int)sizeof(iconvert))); | 631 | if (iplace == sizeof iconvert) |
| 658 | if (iplace == sizeof iconvert) | 632 | iplace--; |
| 659 | iplace--; | 633 | iconvert[iplace] = 0; |
| 660 | iconvert[iplace] = 0; | 634 | |
| 661 | 635 | /* convert fractional part */ | |
| 662 | /* convert fractional part */ | 636 | do { |
| 663 | do { | 637 | fconvert[fplace++] = (caps ? "0123456789ABCDEF" : |
| 664 | fconvert[fplace++] = | 638 | "0123456789abcdef")[fracpart % 10]; |
| 665 | (caps ? "0123456789ABCDEF" | 639 | fracpart = (fracpart / 10); |
| 666 | : "0123456789abcdef")[fracpart % 10]; | 640 | } while (fplace < max); |
| 667 | fracpart = (fracpart / 10); | 641 | if (fplace == sizeof fconvert) |
| 668 | } while (fplace < max); | 642 | fplace--; |
| 669 | if (fplace == sizeof fconvert) | 643 | fconvert[fplace] = 0; |
| 670 | fplace--; | 644 | |
| 671 | fconvert[fplace] = 0; | 645 | /* -1 for decimal point, another -1 if we are printing a sign */ |
| 672 | 646 | padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); | |
| 673 | /* -1 for decimal point, another -1 if we are printing a sign */ | 647 | zpadlen = max - fplace; |
| 674 | padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); | 648 | if (zpadlen < 0) |
| 675 | zpadlen = max - fplace; | 649 | zpadlen = 0; |
| 676 | if (zpadlen < 0) | 650 | if (padlen < 0) |
| 677 | zpadlen = 0; | 651 | padlen = 0; |
| 678 | if (padlen < 0) | 652 | if (flags & DP_F_MINUS) |
| 679 | padlen = 0; | 653 | padlen = -padlen; |
| 680 | if (flags & DP_F_MINUS) | 654 | |
| 681 | padlen = -padlen; | 655 | if ((flags & DP_F_ZERO) && (padlen > 0)) { |
| 682 | 656 | if (signvalue) { | |
| 683 | if ((flags & DP_F_ZERO) && (padlen > 0)) { | 657 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); |
| 684 | if (signvalue) { | 658 | --padlen; |
| 685 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); | 659 | signvalue = 0; |
| 686 | --padlen; | 660 | } |
| 687 | signvalue = 0; | 661 | while (padlen > 0) { |
| 688 | } | 662 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); |
| 689 | while (padlen > 0) { | 663 | --padlen; |
| 690 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); | 664 | } |
| 691 | --padlen; | 665 | } |
| 692 | } | 666 | while (padlen > 0) { |
| 693 | } | 667 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
| 694 | while (padlen > 0) { | 668 | --padlen; |
| 695 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | 669 | } |
| 696 | --padlen; | 670 | if (signvalue) |
| 697 | } | 671 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); |
| 698 | if (signvalue) | 672 | |
| 699 | doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); | 673 | while (iplace > 0) |
| 700 | 674 | doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]); | |
| 701 | while (iplace > 0) | 675 | |
| 702 | doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]); | 676 | /* |
| 703 | 677 | * Decimal point. This should probably use locale to find the correct | |
| 704 | /* | 678 | * char to print out. |
| 705 | * Decimal point. This should probably use locale to find the correct | 679 | */ |
| 706 | * char to print out. | 680 | if (max > 0 || (flags & DP_F_NUM)) { |
| 707 | */ | 681 | doapr_outch(sbuffer, buffer, currlen, maxlen, '.'); |
| 708 | if (max > 0 || (flags & DP_F_NUM)) { | 682 | |
| 709 | doapr_outch(sbuffer, buffer, currlen, maxlen, '.'); | 683 | while (fplace > 0) |
| 710 | 684 | doapr_outch(sbuffer, buffer, currlen, maxlen, fconvert[--fplace]); | |
| 711 | while (fplace > 0) | 685 | } |
| 712 | doapr_outch(sbuffer, buffer, currlen, maxlen, fconvert[--fplace]); | 686 | while (zpadlen > 0) { |
| 713 | } | 687 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); |
| 714 | while (zpadlen > 0) { | 688 | --zpadlen; |
| 715 | doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); | 689 | } |
| 716 | --zpadlen; | 690 | |
| 717 | } | 691 | while (padlen < 0) { |
| 718 | 692 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | |
| 719 | while (padlen < 0) { | 693 | ++padlen; |
| 720 | doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); | 694 | } |
| 721 | ++padlen; | ||
| 722 | } | ||
| 723 | } | 695 | } |
| 724 | 696 | ||
| 725 | static void | 697 | static void |
| 726 | doapr_outch( | 698 | doapr_outch(char **sbuffer, char **buffer, size_t *currlen, size_t *maxlen, |
| 727 | char **sbuffer, | ||
| 728 | char **buffer, | ||
| 729 | size_t *currlen, | ||
| 730 | size_t *maxlen, | ||
| 731 | int c) | 699 | int c) |
| 732 | { | 700 | { |
| 733 | /* If we haven't at least one buffer, someone has doe a big booboo */ | 701 | /* If we haven't at least one buffer, someone has doe a big booboo */ |
| 734 | assert(*sbuffer != NULL || buffer != NULL); | 702 | assert(*sbuffer != NULL || buffer != NULL); |
| 735 | 703 | ||
| 736 | if (buffer) { | 704 | if (buffer) { |
| 737 | while (*currlen >= *maxlen) { | 705 | while (*currlen >= *maxlen) { |
| 738 | if (*buffer == NULL) { | 706 | if (*buffer == NULL) { |
| 739 | if (*maxlen == 0) | 707 | if (*maxlen == 0) |
| 740 | *maxlen = 1024; | 708 | *maxlen = 1024; |
| 741 | *buffer = OPENSSL_malloc(*maxlen); | 709 | *buffer = OPENSSL_malloc(*maxlen); |
| 742 | if (*currlen > 0) { | 710 | if (*currlen > 0) { |
| 743 | assert(*sbuffer != NULL); | 711 | assert(*sbuffer != NULL); |
| 744 | memcpy(*buffer, *sbuffer, *currlen); | 712 | memcpy(*buffer, *sbuffer, *currlen); |
| 713 | } | ||
| 714 | *sbuffer = NULL; | ||
| 715 | } else { | ||
| 716 | *maxlen += 1024; | ||
| 717 | *buffer = OPENSSL_realloc(*buffer, *maxlen); | ||
| 718 | } | ||
| 745 | } | 719 | } |
| 746 | *sbuffer = NULL; | 720 | /* What to do if *buffer is NULL? */ |
| 747 | } else { | 721 | assert(*sbuffer != NULL || *buffer != NULL); |
| 748 | *maxlen += 1024; | ||
| 749 | *buffer = OPENSSL_realloc(*buffer, *maxlen); | ||
| 750 | } | ||
| 751 | } | 722 | } |
| 752 | /* What to do if *buffer is NULL? */ | ||
| 753 | assert(*sbuffer != NULL || *buffer != NULL); | ||
| 754 | } | ||
| 755 | 723 | ||
| 756 | if (*currlen < *maxlen) { | 724 | if (*currlen < *maxlen) { |
| 757 | if (*sbuffer) | 725 | if (*sbuffer) |
| 758 | (*sbuffer)[(*currlen)++] = (char)c; | 726 | (*sbuffer)[(*currlen)++] = (char)c; |
| 759 | else | 727 | else |
| 760 | (*buffer)[(*currlen)++] = (char)c; | 728 | (*buffer)[(*currlen)++] = (char)c; |
| 761 | } | 729 | } |
| 762 | 730 | ||
| 763 | return; | 731 | return; |
| 764 | } | 732 | } |
| 765 | 733 | ||
| 766 | /***************************************************************************/ | 734 | /***************************************************************************/ |
| 767 | 735 | ||
| 768 | int BIO_printf (BIO *bio, const char *format, ...) | 736 | int BIO_printf (BIO *bio, const char *format, ...) |
| 769 | { | 737 | { |
| 770 | va_list args; | 738 | va_list args; |
| 771 | int ret; | 739 | int ret; |
| 772 | 740 | ||
| @@ -775,15 +743,15 @@ int BIO_printf (BIO *bio, const char *format, ...) | |||
| 775 | ret = BIO_vprintf(bio, format, args); | 743 | ret = BIO_vprintf(bio, format, args); |
| 776 | 744 | ||
| 777 | va_end(args); | 745 | va_end(args); |
| 778 | return(ret); | 746 | return (ret); |
| 779 | } | 747 | } |
| 780 | 748 | ||
| 781 | int BIO_vprintf (BIO *bio, const char *format, va_list args) | 749 | int BIO_vprintf (BIO *bio, const char *format, va_list args) |
| 782 | { | 750 | { |
| 783 | int ret; | 751 | int ret; |
| 784 | size_t retlen; | 752 | size_t retlen; |
| 785 | char hugebuf[1024*2]; /* Was previously 10k, which is unreasonable | 753 | char hugebuf[1024*2]; /* Was previously 10k, which is unreasonable |
| 786 | in small-stack environments, like threads | 754 | in small - stack environments, like threads |
| 787 | or DOS programs. */ | 755 | or DOS programs. */ |
| 788 | char *hugebufp = hugebuf; | 756 | char *hugebufp = hugebuf; |
| 789 | size_t hugebufsize = sizeof(hugebuf); | 757 | size_t hugebufsize = sizeof(hugebuf); |
| @@ -792,27 +760,25 @@ int BIO_vprintf (BIO *bio, const char *format, va_list args) | |||
| 792 | 760 | ||
| 793 | dynbuf = NULL; | 761 | dynbuf = NULL; |
| 794 | CRYPTO_push_info("doapr()"); | 762 | CRYPTO_push_info("doapr()"); |
| 795 | _dopr(&hugebufp, &dynbuf, &hugebufsize, | 763 | _dopr(&hugebufp, &dynbuf, &hugebufsize, &retlen, &ignored, |
| 796 | &retlen, &ignored, format, args); | 764 | format, args); |
| 797 | if (dynbuf) | 765 | if (dynbuf) { |
| 798 | { | 766 | ret = BIO_write(bio, dynbuf, (int)retlen); |
| 799 | ret=BIO_write(bio, dynbuf, (int)retlen); | ||
| 800 | OPENSSL_free(dynbuf); | 767 | OPENSSL_free(dynbuf); |
| 801 | } | 768 | } else { |
| 802 | else | 769 | ret = BIO_write(bio, hugebuf, (int)retlen); |
| 803 | { | ||
| 804 | ret=BIO_write(bio, hugebuf, (int)retlen); | ||
| 805 | } | ||
| 806 | CRYPTO_pop_info(); | ||
| 807 | return(ret); | ||
| 808 | } | 770 | } |
| 771 | CRYPTO_pop_info(); | ||
| 772 | return (ret); | ||
| 773 | } | ||
| 809 | 774 | ||
| 810 | /* As snprintf is not available everywhere, we provide our own implementation. | 775 | /* As snprintf is not available everywhere, we provide our own implementation. |
| 811 | * This function has nothing to do with BIOs, but it's closely related | 776 | * This function has nothing to do with BIOs, but it's closely related |
| 812 | * to BIO_printf, and we need *some* name prefix ... | 777 | * to BIO_printf, and we need *some* name prefix ... |
| 813 | * (XXX the function should be renamed, but to what?) */ | 778 | * (XXX the function should be renamed, but to what?) */ |
| 814 | int BIO_snprintf(char *buf, size_t n, const char *format, ...) | 779 | int |
| 815 | { | 780 | BIO_snprintf(char *buf, size_t n, const char *format, ...) |
| 781 | { | ||
| 816 | va_list args; | 782 | va_list args; |
| 817 | int ret; | 783 | int ret; |
| 818 | 784 | ||
| @@ -821,11 +787,12 @@ int BIO_snprintf(char *buf, size_t n, const char *format, ...) | |||
| 821 | ret = BIO_vsnprintf(buf, n, format, args); | 787 | ret = BIO_vsnprintf(buf, n, format, args); |
| 822 | 788 | ||
| 823 | va_end(args); | 789 | va_end(args); |
| 824 | return(ret); | 790 | return (ret); |
| 825 | } | 791 | } |
| 826 | 792 | ||
| 827 | int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) | 793 | int |
| 828 | { | 794 | BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) |
| 795 | { | ||
| 829 | size_t retlen; | 796 | size_t retlen; |
| 830 | int truncated; | 797 | int truncated; |
| 831 | 798 | ||
| @@ -839,4 +806,4 @@ int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) | |||
| 839 | return -1; | 806 | return -1; |
| 840 | else | 807 | else |
| 841 | return (retlen <= INT_MAX) ? (int)retlen : -1; | 808 | return (retlen <= INT_MAX) ? (int)retlen : -1; |
| 842 | } | 809 | } |
diff --git a/src/lib/libssl/src/crypto/bio/b_sock.c b/src/lib/libssl/src/crypto/bio/b_sock.c index bd43307456..d739452580 100644 --- a/src/lib/libssl/src/crypto/bio/b_sock.c +++ b/src/lib/libssl/src/crypto/bio/b_sock.c | |||
| @@ -85,7 +85,7 @@ NETDB_DEFINE_CONTEXT | |||
| 85 | #endif | 85 | #endif |
| 86 | 86 | ||
| 87 | #if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) | 87 | #if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) |
| 88 | static int wsa_init_done=0; | 88 | static int wsa_init_done = 0; |
| 89 | #endif | 89 | #endif |
| 90 | 90 | ||
| 91 | /* | 91 | /* |
| @@ -100,36 +100,36 @@ static int wsa_init_done=0; | |||
| 100 | #endif | 100 | #endif |
| 101 | 101 | ||
| 102 | #if 0 | 102 | #if 0 |
| 103 | static unsigned long BIO_ghbn_hits=0L; | 103 | static unsigned long BIO_ghbn_hits = 0L; |
| 104 | static unsigned long BIO_ghbn_miss=0L; | 104 | static unsigned long BIO_ghbn_miss = 0L; |
| 105 | 105 | ||
| 106 | #define GHBN_NUM 4 | 106 | #define GHBN_NUM 4 |
| 107 | static struct ghbn_cache_st | 107 | static struct ghbn_cache_st { |
| 108 | { | ||
| 109 | char name[129]; | 108 | char name[129]; |
| 110 | struct hostent *ent; | 109 | struct hostent *ent; |
| 111 | unsigned long order; | 110 | unsigned long order; |
| 112 | } ghbn_cache[GHBN_NUM]; | 111 | } ghbn_cache[GHBN_NUM]; |
| 113 | #endif | 112 | #endif |
| 114 | 113 | ||
| 115 | static int get_ip(const char *str,unsigned char *ip); | 114 | static int get_ip(const char *str, unsigned char *ip); |
| 116 | #if 0 | 115 | #if 0 |
| 117 | static void ghbn_free(struct hostent *a); | 116 | static void ghbn_free(struct hostent *a); |
| 118 | static struct hostent *ghbn_dup(struct hostent *a); | 117 | static struct hostent *ghbn_dup(struct hostent *a); |
| 119 | #endif | 118 | #endif |
| 120 | int BIO_get_host_ip(const char *str, unsigned char *ip) | 119 | |
| 121 | { | 120 | int |
| 121 | BIO_get_host_ip(const char *str, unsigned char *ip) | ||
| 122 | { | ||
| 122 | int i; | 123 | int i; |
| 123 | int err = 1; | 124 | int err = 1; |
| 124 | int locked = 0; | 125 | int locked = 0; |
| 125 | struct hostent *he; | 126 | struct hostent *he; |
| 126 | 127 | ||
| 127 | i=get_ip(str,ip); | 128 | i = get_ip(str, ip); |
| 128 | if (i < 0) | 129 | if (i < 0) { |
| 129 | { | 130 | BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_INVALID_IP_ADDRESS); |
| 130 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS); | ||
| 131 | goto err; | 131 | goto err; |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | /* At this point, we have something that is most probably correct | 134 | /* At this point, we have something that is most probably correct |
| 135 | in some way, so let's init the socket. */ | 135 | in some way, so let's init the socket. */ |
| @@ -138,172 +138,169 @@ int BIO_get_host_ip(const char *str, unsigned char *ip) | |||
| 138 | 138 | ||
| 139 | /* If the string actually contained an IP address, we need not do | 139 | /* If the string actually contained an IP address, we need not do |
| 140 | anything more */ | 140 | anything more */ |
| 141 | if (i > 0) return(1); | 141 | if (i > 0) |
| 142 | return (1); | ||
| 142 | 143 | ||
| 143 | /* do a gethostbyname */ | 144 | /* do a gethostbyname */ |
| 144 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); | 145 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); |
| 145 | locked = 1; | 146 | locked = 1; |
| 146 | he=BIO_gethostbyname(str); | 147 | he = BIO_gethostbyname(str); |
| 147 | if (he == NULL) | 148 | if (he == NULL) { |
| 148 | { | 149 | BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_BAD_HOSTNAME_LOOKUP); |
| 149 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP); | ||
| 150 | goto err; | 150 | goto err; |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | /* cast to short because of win16 winsock definition */ | 153 | /* cast to short because of win16 winsock definition */ |
| 154 | if ((short)he->h_addrtype != AF_INET) | 154 | if ((short)he->h_addrtype != AF_INET) { |
| 155 | { | 155 | BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET); |
| 156 | BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET); | ||
| 157 | goto err; | 156 | goto err; |
| 158 | } | 157 | } |
| 159 | for (i=0; i<4; i++) | 158 | for (i = 0; i < 4; i++) |
| 160 | ip[i]=he->h_addr_list[0][i]; | 159 | ip[i] = he->h_addr_list[0][i]; |
| 161 | err = 0; | 160 | err = 0; |
| 162 | 161 | ||
| 163 | err: | 162 | err: |
| 164 | if (locked) | 163 | if (locked) |
| 165 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); | 164 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); |
| 166 | if (err) | 165 | if (err) { |
| 167 | { | 166 | ERR_add_error_data(2, "host=", str); |
| 168 | ERR_add_error_data(2,"host=",str); | ||
| 169 | return 0; | 167 | return 0; |
| 170 | } | 168 | } else |
| 171 | else | ||
| 172 | return 1; | 169 | return 1; |
| 173 | } | 170 | } |
| 174 | 171 | ||
| 175 | int BIO_get_port(const char *str, unsigned short *port_ptr) | 172 | int |
| 176 | { | 173 | BIO_get_port(const char *str, unsigned short *port_ptr) |
| 174 | { | ||
| 177 | int i; | 175 | int i; |
| 178 | struct servent *s; | 176 | struct servent *s; |
| 179 | 177 | ||
| 180 | if (str == NULL) | 178 | if (str == NULL) { |
| 181 | { | 179 | BIOerr(BIO_F_BIO_GET_PORT, BIO_R_NO_PORT_DEFINED); |
| 182 | BIOerr(BIO_F_BIO_GET_PORT,BIO_R_NO_PORT_DEFINED); | 180 | return (0); |
| 183 | return(0); | 181 | } |
| 184 | } | 182 | i = atoi(str); |
| 185 | i=atoi(str); | ||
| 186 | if (i != 0) | 183 | if (i != 0) |
| 187 | *port_ptr=(unsigned short)i; | 184 | *port_ptr = (unsigned short)i; |
| 188 | else | 185 | else { |
| 189 | { | ||
| 190 | CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME); | 186 | CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME); |
| 191 | /* Note: under VMS with SOCKETSHR, it seems like the first | 187 | /* Note: under VMS with SOCKETSHR, it seems like the first |
| 192 | * parameter is 'char *', instead of 'const char *' | 188 | * parameter is 'char *', instead of 'const char *' |
| 193 | */ | 189 | */ |
| 194 | #ifndef CONST_STRICT | 190 | #ifndef CONST_STRICT |
| 195 | s=getservbyname((char *)str,"tcp"); | 191 | s = getservbyname((char *)str, "tcp"); |
| 196 | #else | 192 | #else |
| 197 | s=getservbyname(str,"tcp"); | 193 | s = getservbyname(str, "tcp"); |
| 198 | #endif | 194 | #endif |
| 199 | if(s != NULL) | 195 | if (s != NULL) |
| 200 | *port_ptr=ntohs((unsigned short)s->s_port); | 196 | *port_ptr = ntohs((unsigned short)s->s_port); |
| 201 | CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME); | 197 | CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME); |
| 202 | if(s == NULL) | 198 | if (s == NULL) { |
| 203 | { | 199 | if (strcmp(str, "http") == 0) |
| 204 | if (strcmp(str,"http") == 0) | 200 | *port_ptr = 80; |
| 205 | *port_ptr=80; | 201 | else if (strcmp(str, "telnet") == 0) |
| 206 | else if (strcmp(str,"telnet") == 0) | 202 | *port_ptr = 23; |
| 207 | *port_ptr=23; | 203 | else if (strcmp(str, "socks") == 0) |
| 208 | else if (strcmp(str,"socks") == 0) | 204 | *port_ptr = 1080; |
| 209 | *port_ptr=1080; | 205 | else if (strcmp(str, "https") == 0) |
| 210 | else if (strcmp(str,"https") == 0) | 206 | *port_ptr = 443; |
| 211 | *port_ptr=443; | 207 | else if (strcmp(str, "ssl") == 0) |
| 212 | else if (strcmp(str,"ssl") == 0) | 208 | *port_ptr = 443; |
| 213 | *port_ptr=443; | 209 | else if (strcmp(str, "ftp") == 0) |
| 214 | else if (strcmp(str,"ftp") == 0) | 210 | *port_ptr = 21; |
| 215 | *port_ptr=21; | 211 | else if (strcmp(str, "gopher") == 0) |
| 216 | else if (strcmp(str,"gopher") == 0) | 212 | *port_ptr = 70; |
| 217 | *port_ptr=70; | ||
| 218 | #if 0 | 213 | #if 0 |
| 219 | else if (strcmp(str,"wais") == 0) | 214 | else if (strcmp(str, "wais") == 0) |
| 220 | *port_ptr=21; | 215 | *port_ptr = 21; |
| 221 | #endif | 216 | #endif |
| 222 | else | 217 | else { |
| 223 | { | 218 | SYSerr(SYS_F_GETSERVBYNAME, errno); |
| 224 | SYSerr(SYS_F_GETSERVBYNAME,errno); | 219 | ERR_add_error_data(3, "service = '", str, "'"); |
| 225 | ERR_add_error_data(3,"service='",str,"'"); | 220 | return (0); |
| 226 | return(0); | ||
| 227 | } | ||
| 228 | } | 221 | } |
| 229 | } | 222 | } |
| 230 | return(1); | ||
| 231 | } | 223 | } |
| 224 | return (1); | ||
| 225 | } | ||
| 232 | 226 | ||
| 233 | int BIO_sock_error(int sock) | 227 | int |
| 234 | { | 228 | BIO_sock_error(int sock) |
| 235 | int j,i; | 229 | { |
| 230 | int j, i; | ||
| 236 | int size; | 231 | int size; |
| 237 | 232 | ||
| 238 | #if defined(OPENSSL_SYS_BEOS_R5) | 233 | #if defined(OPENSSL_SYS_BEOS_R5) |
| 239 | return 0; | 234 | return 0; |
| 240 | #endif | 235 | #endif |
| 241 | 236 | ||
| 242 | size=sizeof(int); | 237 | size = sizeof(int); |
| 243 | /* Note: under Windows the third parameter is of type (char *) | 238 | /* Note: under Windows the third parameter is of type (char *) |
| 244 | * whereas under other systems it is (void *) if you don't have | 239 | * whereas under other systems it is (void *) if you don't have |
| 245 | * a cast it will choke the compiler: if you do have a cast then | 240 | * a cast it will choke the compiler: if you do have a cast then |
| 246 | * you can either go for (char *) or (void *). | 241 | * you can either go for (char *) or (void *). |
| 247 | */ | 242 | */ |
| 248 | i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(void *)&j,(void *)&size); | 243 | i = getsockopt(sock, SOL_SOCKET, SO_ERROR,(void *)&j,(void *)&size); |
| 249 | if (i < 0) | 244 | if (i < 0) |
| 250 | return(1); | 245 | return (1); |
| 251 | else | 246 | else |
| 252 | return(j); | 247 | return (j); |
| 253 | } | 248 | } |
| 254 | 249 | ||
| 255 | #if 0 | 250 | #if 0 |
| 256 | long BIO_ghbn_ctrl(int cmd, int iarg, char *parg) | 251 | long |
| 257 | { | 252 | BIO_ghbn_ctrl(int cmd, int iarg, char *parg) |
| 253 | { | ||
| 258 | int i; | 254 | int i; |
| 259 | char **p; | 255 | char **p; |
| 260 | 256 | ||
| 261 | switch (cmd) | 257 | switch (cmd) { |
| 262 | { | ||
| 263 | case BIO_GHBN_CTRL_HITS: | 258 | case BIO_GHBN_CTRL_HITS: |
| 264 | return(BIO_ghbn_hits); | 259 | return (BIO_ghbn_hits); |
| 265 | /* break; */ | 260 | /* break; */ |
| 266 | case BIO_GHBN_CTRL_MISSES: | 261 | case BIO_GHBN_CTRL_MISSES: |
| 267 | return(BIO_ghbn_miss); | 262 | return (BIO_ghbn_miss); |
| 268 | /* break; */ | 263 | /* break; */ |
| 269 | case BIO_GHBN_CTRL_CACHE_SIZE: | 264 | case BIO_GHBN_CTRL_CACHE_SIZE: |
| 270 | return(GHBN_NUM); | 265 | return (GHBN_NUM); |
| 271 | /* break; */ | 266 | /* break; */ |
| 272 | case BIO_GHBN_CTRL_GET_ENTRY: | 267 | case BIO_GHBN_CTRL_GET_ENTRY: |
| 273 | if ((iarg >= 0) && (iarg <GHBN_NUM) && | 268 | if ((iarg >= 0) && (iarg < GHBN_NUM) && |
| 274 | (ghbn_cache[iarg].order > 0)) | 269 | (ghbn_cache[iarg].order > 0)) { |
| 275 | { | 270 | p = (char **)parg; |
| 276 | p=(char **)parg; | 271 | if (p == NULL) |
| 277 | if (p == NULL) return(0); | 272 | return (0); |
| 278 | *p=ghbn_cache[iarg].name; | 273 | *p = ghbn_cache[iarg].name; |
| 279 | ghbn_cache[iarg].name[128]='\0'; | 274 | ghbn_cache[iarg].name[128] = '\0'; |
| 280 | return(1); | 275 | return (1); |
| 281 | } | 276 | } |
| 282 | return(0); | 277 | return (0); |
| 283 | /* break; */ | 278 | /* break; */ |
| 284 | case BIO_GHBN_CTRL_FLUSH: | 279 | case BIO_GHBN_CTRL_FLUSH: |
| 285 | for (i=0; i<GHBN_NUM; i++) | 280 | for (i = 0; i < GHBN_NUM; i++) |
| 286 | ghbn_cache[i].order=0; | 281 | ghbn_cache[i].order = 0; |
| 287 | break; | 282 | break; |
| 288 | default: | 283 | default: |
| 289 | return(0); | 284 | return (0); |
| 290 | } | ||
| 291 | return(1); | ||
| 292 | } | 285 | } |
| 286 | return (1); | ||
| 287 | } | ||
| 293 | #endif | 288 | #endif |
| 294 | 289 | ||
| 295 | #if 0 | 290 | #if 0 |
| 296 | static struct hostent *ghbn_dup(struct hostent *a) | 291 | static struct hostent |
| 297 | { | 292 | *ghbn_dup(struct hostent *a) |
| 293 | { | ||
| 298 | struct hostent *ret; | 294 | struct hostent *ret; |
| 299 | int i,j; | 295 | int i, j; |
| 300 | 296 | ||
| 301 | MemCheck_off(); | 297 | MemCheck_off(); |
| 302 | ret=(struct hostent *)OPENSSL_malloc(sizeof(struct hostent)); | 298 | ret = (struct hostent *)OPENSSL_malloc(sizeof(struct hostent)); |
| 303 | if (ret == NULL) return(NULL); | 299 | if (ret == NULL) |
| 304 | memset(ret,0,sizeof(struct hostent)); | 300 | return (NULL); |
| 301 | memset(ret, 0, sizeof(struct hostent)); | ||
| 305 | 302 | ||
| 306 | for (i=0; a->h_aliases[i] != NULL; i++) | 303 | for (i = 0; a->h_aliases[i] != NULL; i++) |
| 307 | ; | 304 | ; |
| 308 | i++; | 305 | i++; |
| 309 | ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *)); | 306 | ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *)); |
| @@ -311,69 +308,66 @@ static struct hostent *ghbn_dup(struct hostent *a) | |||
| 311 | goto err; | 308 | goto err; |
| 312 | memset(ret->h_aliases, 0, i*sizeof(char *)); | 309 | memset(ret->h_aliases, 0, i*sizeof(char *)); |
| 313 | 310 | ||
| 314 | for (i=0; a->h_addr_list[i] != NULL; i++) | 311 | for (i = 0; a->h_addr_list[i] != NULL; i++) |
| 315 | ; | 312 | ; |
| 316 | i++; | 313 | i++; |
| 317 | ret->h_addr_list=(char **)OPENSSL_malloc(i*sizeof(char *)); | 314 | ret->h_addr_list = (char **)OPENSSL_malloc(i*sizeof(char *)); |
| 318 | if (ret->h_addr_list == NULL) | 315 | if (ret->h_addr_list == NULL) |
| 319 | goto err; | 316 | goto err; |
| 320 | memset(ret->h_addr_list, 0, i*sizeof(char *)); | 317 | memset(ret->h_addr_list, 0, i*sizeof(char *)); |
| 321 | 318 | ||
| 322 | j=strlen(a->h_name)+1; | 319 | j = strlen(a->h_name) + 1; |
| 323 | if ((ret->h_name=OPENSSL_malloc(j)) == NULL) goto err; | 320 | if ((ret->h_name = OPENSSL_malloc(j)) == NULL) goto err; |
| 324 | memcpy((char *)ret->h_name,a->h_name,j); | 321 | memcpy((char *)ret->h_name, a->h_name, j); |
| 325 | for (i=0; a->h_aliases[i] != NULL; i++) | 322 | for (i = 0; a->h_aliases[i] != NULL; i++) { |
| 326 | { | 323 | j = strlen(a->h_aliases[i]) + 1; |
| 327 | j=strlen(a->h_aliases[i])+1; | 324 | if ((ret->h_aliases[i] = OPENSSL_malloc(j)) == NULL) goto err; |
| 328 | if ((ret->h_aliases[i]=OPENSSL_malloc(j)) == NULL) goto err; | 325 | memcpy(ret->h_aliases[i], a->h_aliases[i], j); |
| 329 | memcpy(ret->h_aliases[i],a->h_aliases[i],j); | 326 | } |
| 330 | } | 327 | ret->h_length = a->h_length; |
| 331 | ret->h_length=a->h_length; | 328 | ret->h_addrtype = a->h_addrtype; |
| 332 | ret->h_addrtype=a->h_addrtype; | 329 | for (i = 0; a->h_addr_list[i] != NULL; i++) { |
| 333 | for (i=0; a->h_addr_list[i] != NULL; i++) | 330 | if ((ret->h_addr_list[i] = OPENSSL_malloc(a->h_length)) == NULL) |
| 334 | { | ||
| 335 | if ((ret->h_addr_list[i]=OPENSSL_malloc(a->h_length)) == NULL) | ||
| 336 | goto err; | 331 | goto err; |
| 337 | memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length); | 332 | memcpy(ret->h_addr_list[i], a->h_addr_list[i], a->h_length); |
| 338 | } | 333 | } |
| 339 | if (0) | 334 | if (0) { |
| 340 | { | 335 | err: |
| 341 | err: | ||
| 342 | if (ret != NULL) | 336 | if (ret != NULL) |
| 343 | ghbn_free(ret); | 337 | ghbn_free(ret); |
| 344 | ret=NULL; | 338 | ret = NULL; |
| 345 | } | ||
| 346 | MemCheck_on(); | ||
| 347 | return(ret); | ||
| 348 | } | 339 | } |
| 340 | MemCheck_on(); | ||
| 341 | return (ret); | ||
| 342 | } | ||
| 349 | 343 | ||
| 350 | static void ghbn_free(struct hostent *a) | 344 | static void |
| 351 | { | 345 | ghbn_free(struct hostent *a) |
| 346 | { | ||
| 352 | int i; | 347 | int i; |
| 353 | 348 | ||
| 354 | if(a == NULL) | 349 | if (a == NULL) |
| 355 | return; | 350 | return; |
| 356 | 351 | ||
| 357 | if (a->h_aliases != NULL) | 352 | if (a->h_aliases != NULL) { |
| 358 | { | 353 | for (i = 0; a->h_aliases[i] != NULL; i++) |
| 359 | for (i=0; a->h_aliases[i] != NULL; i++) | ||
| 360 | OPENSSL_free(a->h_aliases[i]); | 354 | OPENSSL_free(a->h_aliases[i]); |
| 361 | OPENSSL_free(a->h_aliases); | 355 | OPENSSL_free(a->h_aliases); |
| 362 | } | 356 | } |
| 363 | if (a->h_addr_list != NULL) | 357 | if (a->h_addr_list != NULL) { |
| 364 | { | 358 | for (i = 0; a->h_addr_list[i] != NULL; i++) |
| 365 | for (i=0; a->h_addr_list[i] != NULL; i++) | ||
| 366 | OPENSSL_free(a->h_addr_list[i]); | 359 | OPENSSL_free(a->h_addr_list[i]); |
| 367 | OPENSSL_free(a->h_addr_list); | 360 | OPENSSL_free(a->h_addr_list); |
| 368 | } | ||
| 369 | if (a->h_name != NULL) OPENSSL_free(a->h_name); | ||
| 370 | OPENSSL_free(a); | ||
| 371 | } | 361 | } |
| 362 | if (a->h_name != NULL) | ||
| 363 | OPENSSL_free(a->h_name); | ||
| 364 | OPENSSL_free(a); | ||
| 365 | } | ||
| 372 | 366 | ||
| 373 | #endif | 367 | #endif |
| 374 | 368 | ||
| 375 | struct hostent *BIO_gethostbyname(const char *name) | 369 | struct hostent |
| 376 | { | 370 | *BIO_gethostbyname(const char *name) { |
| 377 | #if 1 | 371 | #if 1 |
| 378 | /* Caching gethostbyname() results forever is wrong, | 372 | /* Caching gethostbyname() results forever is wrong, |
| 379 | * so we have to let the true gethostbyname() worry about this */ | 373 | * so we have to let the true gethostbyname() worry about this */ |
| @@ -384,8 +378,8 @@ struct hostent *BIO_gethostbyname(const char *name) | |||
| 384 | #endif | 378 | #endif |
| 385 | #else | 379 | #else |
| 386 | struct hostent *ret; | 380 | struct hostent *ret; |
| 387 | int i,lowi=0,j; | 381 | int i, lowi = 0, j; |
| 388 | unsigned long low= (unsigned long)-1; | 382 | unsigned long low = (unsigned long) - 1; |
| 389 | 383 | ||
| 390 | 384 | ||
| 391 | # if 0 | 385 | # if 0 |
| @@ -395,42 +389,37 @@ struct hostent *BIO_gethostbyname(const char *name) | |||
| 395 | */ | 389 | */ |
| 396 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); | 390 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); |
| 397 | # endif | 391 | # endif |
| 398 | j=strlen(name); | 392 | j = strlen(name); |
| 399 | if (j < 128) | 393 | if (j < 128) { |
| 400 | { | 394 | for (i = 0; i < GHBN_NUM; i++) { |
| 401 | for (i=0; i<GHBN_NUM; i++) | 395 | if (low > ghbn_cache[i].order) { |
| 402 | { | 396 | low = ghbn_cache[i].order; |
| 403 | if (low > ghbn_cache[i].order) | 397 | lowi = i; |
| 404 | { | 398 | } |
| 405 | low=ghbn_cache[i].order; | 399 | if (ghbn_cache[i].order > 0) { |
| 406 | lowi=i; | 400 | if (strncmp(name, ghbn_cache[i].name, 128) == 0) |
| 407 | } | ||
| 408 | if (ghbn_cache[i].order > 0) | ||
| 409 | { | ||
| 410 | if (strncmp(name,ghbn_cache[i].name,128) == 0) | ||
| 411 | break; | 401 | break; |
| 412 | } | ||
| 413 | } | 402 | } |
| 414 | } | 403 | } |
| 415 | else | 404 | } else |
| 416 | i=GHBN_NUM; | 405 | i = GHBN_NUM; |
| 417 | 406 | ||
| 418 | if (i == GHBN_NUM) /* no hit*/ | 407 | if (i == GHBN_NUM) /* no hit*/ |
| 419 | { | 408 | { |
| 420 | BIO_ghbn_miss++; | 409 | BIO_ghbn_miss++; |
| 421 | /* Note: under VMS with SOCKETSHR, it seems like the first | 410 | /* Note: under VMS with SOCKETSHR, it seems like the first |
| 422 | * parameter is 'char *', instead of 'const char *' | 411 | * parameter is 'char *', instead of 'const char *' |
| 423 | */ | 412 | */ |
| 424 | # ifndef CONST_STRICT | 413 | # ifndef CONST_STRICT |
| 425 | ret=gethostbyname((char *)name); | 414 | ret = gethostbyname((char *)name); |
| 426 | # else | 415 | # else |
| 427 | ret=gethostbyname(name); | 416 | ret = gethostbyname(name); |
| 428 | # endif | 417 | # endif |
| 429 | 418 | ||
| 430 | if (ret == NULL) | 419 | if (ret == NULL) |
| 431 | goto end; | 420 | goto end; |
| 432 | if (j > 128) /* too big to cache */ | 421 | if (j > 128) /* too big to cache */ |
| 433 | { | 422 | { |
| 434 | # if 0 | 423 | # if 0 |
| 435 | /* If we were trying to make this function thread-safe (which | 424 | /* If we were trying to make this function thread-safe (which |
| 436 | * is bound to fail), we'd have to give up in this case | 425 | * is bound to fail), we'd have to give up in this case |
| @@ -438,118 +427,113 @@ struct hostent *BIO_gethostbyname(const char *name) | |||
| 438 | ret = NULL; | 427 | ret = NULL; |
| 439 | # endif | 428 | # endif |
| 440 | goto end; | 429 | goto end; |
| 441 | } | 430 | } |
| 442 | 431 | ||
| 443 | /* else add to cache */ | 432 | /* else add to cache */ |
| 444 | if (ghbn_cache[lowi].ent != NULL) | 433 | if (ghbn_cache[lowi].ent != NULL) |
| 445 | ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */ | 434 | ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */ |
| 446 | ghbn_cache[lowi].name[0] = '\0'; | 435 | ghbn_cache[lowi].name[0] = '\0'; |
| 447 | 436 | ||
| 448 | if((ret=ghbn_cache[lowi].ent=ghbn_dup(ret)) == NULL) | 437 | if ((ret = ghbn_cache[lowi].ent = ghbn_dup(ret)) == NULL) { |
| 449 | { | 438 | BIOerr(BIO_F_BIO_GETHOSTBYNAME, ERR_R_MALLOC_FAILURE); |
| 450 | BIOerr(BIO_F_BIO_GETHOSTBYNAME,ERR_R_MALLOC_FAILURE); | ||
| 451 | goto end; | 439 | goto end; |
| 452 | } | ||
| 453 | strncpy(ghbn_cache[lowi].name,name,128); | ||
| 454 | ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits; | ||
| 455 | } | 440 | } |
| 456 | else | 441 | strncpy(ghbn_cache[lowi].name, name, 128); |
| 457 | { | 442 | ghbn_cache[lowi].order = BIO_ghbn_miss + BIO_ghbn_hits; |
| 443 | } else { | ||
| 458 | BIO_ghbn_hits++; | 444 | BIO_ghbn_hits++; |
| 459 | ret= ghbn_cache[i].ent; | 445 | ret = ghbn_cache[i].ent; |
| 460 | ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits; | 446 | ghbn_cache[i].order = BIO_ghbn_miss + BIO_ghbn_hits; |
| 461 | } | 447 | } |
| 462 | end: | 448 | end: |
| 463 | # if 0 | 449 | # if 0 |
| 464 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); | 450 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); |
| 465 | # endif | 451 | # endif |
| 466 | return(ret); | 452 | return (ret); |
| 467 | #endif | 453 | #endif |
| 468 | } | 454 | } |
| 469 | 455 | ||
| 470 | 456 | ||
| 471 | int BIO_sock_init(void) | 457 | int |
| 472 | { | 458 | BIO_sock_init(void) |
| 459 | { | ||
| 473 | #ifdef OPENSSL_SYS_WINDOWS | 460 | #ifdef OPENSSL_SYS_WINDOWS |
| 474 | static struct WSAData wsa_state; | 461 | static struct WSAData wsa_state; |
| 475 | 462 | ||
| 476 | if (!wsa_init_done) | 463 | if (!wsa_init_done) { |
| 477 | { | ||
| 478 | int err; | 464 | int err; |
| 479 | 465 | ||
| 480 | wsa_init_done=1; | 466 | wsa_init_done = 1; |
| 481 | memset(&wsa_state,0,sizeof(wsa_state)); | 467 | memset(&wsa_state, 0, sizeof(wsa_state)); |
| 482 | /* Not making wsa_state available to the rest of the | 468 | /* Not making wsa_state available to the rest of the |
| 483 | * code is formally wrong. But the structures we use | 469 | * code is formally wrong. But the structures we use |
| 484 | * are [beleived to be] invariable among Winsock DLLs, | 470 | * are [beleived to be] invariable among Winsock DLLs, |
| 485 | * while API availability is [expected to be] probed | 471 | * while API availability is [expected to be] probed |
| 486 | * at run-time with DSO_global_lookup. */ | 472 | * at run-time with DSO_global_lookup. */ |
| 487 | if (WSAStartup(0x0202,&wsa_state)!=0) | 473 | if (WSAStartup(0x0202, &wsa_state) != 0) { |
| 488 | { | 474 | err = WSAGetLastError(); |
| 489 | err=WSAGetLastError(); | 475 | SYSerr(SYS_F_WSASTARTUP, err); |
| 490 | SYSerr(SYS_F_WSASTARTUP,err); | 476 | BIOerr(BIO_F_BIO_SOCK_INIT, BIO_R_WSASTARTUP); |
| 491 | BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP); | 477 | return (-1); |
| 492 | return(-1); | ||
| 493 | } | ||
| 494 | } | 478 | } |
| 479 | } | ||
| 495 | #endif /* OPENSSL_SYS_WINDOWS */ | 480 | #endif /* OPENSSL_SYS_WINDOWS */ |
| 496 | #ifdef WATT32 | 481 | #ifdef WATT32 |
| 497 | extern int _watt_do_exit; | 482 | extern int _watt_do_exit; |
| 498 | _watt_do_exit = 0; /* don't make sock_init() call exit() */ | 483 | _watt_do_exit = 0; |
| 484 | /* don't make sock_init() call exit() */ | ||
| 499 | if (sock_init()) | 485 | if (sock_init()) |
| 500 | return (-1); | 486 | return (-1); |
| 501 | #endif | 487 | #endif |
| 502 | 488 | ||
| 503 | #if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) | 489 | #if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) |
| 504 | WORD wVerReq; | 490 | WORD wVerReq; |
| 505 | WSADATA wsaData; | 491 | WSADATA wsaData; |
| 506 | int err; | 492 | int err; |
| 507 | 493 | ||
| 508 | if (!wsa_init_done) | 494 | if (!wsa_init_done) { |
| 509 | { | 495 | wsa_init_done = 1; |
| 510 | wsa_init_done=1; | 496 | wVerReq = MAKEWORD( 2, 0 ); |
| 511 | wVerReq = MAKEWORD( 2, 0 ); | 497 | err = WSAStartup(wVerReq, &wsaData); |
| 512 | err = WSAStartup(wVerReq,&wsaData); | 498 | if (err != 0) { |
| 513 | if (err != 0) | 499 | SYSerr(SYS_F_WSASTARTUP, err); |
| 514 | { | 500 | BIOerr(BIO_F_BIO_SOCK_INIT, BIO_R_WSASTARTUP); |
| 515 | SYSerr(SYS_F_WSASTARTUP,err); | 501 | return (-1); |
| 516 | BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP); | ||
| 517 | return(-1); | ||
| 518 | } | ||
| 519 | } | 502 | } |
| 503 | } | ||
| 520 | #endif | 504 | #endif |
| 521 | 505 | ||
| 522 | return(1); | 506 | return (1); |
| 523 | } | 507 | } |
| 524 | 508 | ||
| 525 | void BIO_sock_cleanup(void) | 509 | void |
| 526 | { | 510 | BIO_sock_cleanup(void) |
| 511 | { | ||
| 527 | #ifdef OPENSSL_SYS_WINDOWS | 512 | #ifdef OPENSSL_SYS_WINDOWS |
| 528 | if (wsa_init_done) | 513 | if (wsa_init_done) { |
| 529 | { | 514 | wsa_init_done = 0; |
| 530 | wsa_init_done=0; | ||
| 531 | #if 0 /* this call is claimed to be non-present in Winsock2 */ | 515 | #if 0 /* this call is claimed to be non-present in Winsock2 */ |
| 532 | WSACancelBlockingCall(); | 516 | WSACancelBlockingCall(); |
| 533 | #endif | 517 | #endif |
| 534 | WSACleanup(); | 518 | WSACleanup(); |
| 535 | } | 519 | } |
| 536 | #elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) | 520 | #elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) |
| 537 | if (wsa_init_done) | 521 | if (wsa_init_done) { |
| 538 | { | 522 | wsa_init_done = 0; |
| 539 | wsa_init_done=0; | 523 | WSACleanup(); |
| 540 | WSACleanup(); | ||
| 541 | } | ||
| 542 | #endif | ||
| 543 | } | 524 | } |
| 525 | #endif | ||
| 526 | } | ||
| 544 | 527 | ||
| 545 | #if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000 | 528 | #if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000 |
| 546 | 529 | ||
| 547 | int BIO_socket_ioctl(int fd, long type, void *arg) | 530 | int |
| 548 | { | 531 | BIO_socket_ioctl(int fd, long type, void *arg) |
| 532 | { | ||
| 549 | int i; | 533 | int i; |
| 550 | 534 | ||
| 551 | #ifdef __DJGPP__ | 535 | #ifdef __DJGPP__ |
| 552 | i=ioctl(fd,type,(char *)arg); | 536 | i = ioctl(fd, type,(char *)arg); |
| 553 | #else | 537 | #else |
| 554 | # if defined(OPENSSL_SYS_VMS) | 538 | # if defined(OPENSSL_SYS_VMS) |
| 555 | /* 2011-02-18 SMS. | 539 | /* 2011-02-18 SMS. |
| @@ -574,402 +558,399 @@ int BIO_socket_ioctl(int fd, long type, void *arg) | |||
| 574 | # define ARG arg | 558 | # define ARG arg |
| 575 | # endif /* defined(OPENSSL_SYS_VMS) [else] */ | 559 | # endif /* defined(OPENSSL_SYS_VMS) [else] */ |
| 576 | 560 | ||
| 577 | i=ioctl(fd,type,ARG); | 561 | i = ioctl(fd, type, ARG); |
| 578 | #endif /* __DJGPP__ */ | 562 | #endif /* __DJGPP__ */ |
| 579 | if (i < 0) | 563 | if (i < 0) |
| 580 | SYSerr(SYS_F_IOCTLSOCKET,errno); | 564 | SYSerr(SYS_F_IOCTLSOCKET, errno); |
| 581 | return(i); | 565 | return (i); |
| 582 | } | 566 | } |
| 583 | #endif /* __VMS_VER */ | 567 | #endif /* __VMS_VER */ |
| 584 | 568 | ||
| 585 | /* The reason I have implemented this instead of using sscanf is because | 569 | /* The reason I have implemented this instead of using sscanf is because |
| 586 | * Visual C 1.52c gives an unresolved external when linking a DLL :-( */ | 570 | * Visual C 1.52c gives an unresolved external when linking a DLL :-( */ |
| 587 | static int get_ip(const char *str, unsigned char ip[4]) | 571 | static int |
| 588 | { | 572 | get_ip(const char *str, unsigned char ip[4]) |
| 573 | { | ||
| 589 | unsigned int tmp[4]; | 574 | unsigned int tmp[4]; |
| 590 | int num=0,c,ok=0; | 575 | int num = 0, c, ok = 0; |
| 591 | 576 | ||
| 592 | tmp[0]=tmp[1]=tmp[2]=tmp[3]=0; | 577 | tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0; |
| 593 | 578 | ||
| 594 | for (;;) | 579 | for (;;) { |
| 595 | { | ||
| 596 | c= *(str++); | 580 | c= *(str++); |
| 597 | if ((c >= '0') && (c <= '9')) | 581 | if ((c >= '0') && (c <= '9')) { |
| 598 | { | 582 | ok = 1; |
| 599 | ok=1; | 583 | tmp[num] = tmp[num]*10 + c-'0'; |
| 600 | tmp[num]=tmp[num]*10+c-'0'; | 584 | if (tmp[num] > 255) |
| 601 | if (tmp[num] > 255) return(0); | 585 | return (0); |
| 602 | } | 586 | } else if (c == '.') { |
| 603 | else if (c == '.') | 587 | if (!ok) |
| 604 | { | 588 | return (-1); |
| 605 | if (!ok) return(-1); | 589 | if (num == 3) |
| 606 | if (num == 3) return(0); | 590 | return (0); |
| 607 | num++; | 591 | num++; |
| 608 | ok=0; | 592 | ok = 0; |
| 609 | } | 593 | } else if (c == '\0' && (num == 3) && ok) |
| 610 | else if (c == '\0' && (num == 3) && ok) | 594 | break; |
| 611 | break; | ||
| 612 | else | 595 | else |
| 613 | return(0); | 596 | return (0); |
| 614 | } | ||
| 615 | ip[0]=tmp[0]; | ||
| 616 | ip[1]=tmp[1]; | ||
| 617 | ip[2]=tmp[2]; | ||
| 618 | ip[3]=tmp[3]; | ||
| 619 | return(1); | ||
| 620 | } | 597 | } |
| 621 | 598 | ip[0] = tmp[0]; | |
| 622 | int BIO_get_accept_socket(char *host, int bind_mode) | 599 | ip[1] = tmp[1]; |
| 623 | { | 600 | ip[2] = tmp[2]; |
| 624 | int ret=0; | 601 | ip[3] = tmp[3]; |
| 602 | return (1); | ||
| 603 | } | ||
| 604 | |||
| 605 | int | ||
| 606 | BIO_get_accept_socket(char *host, int bind_mode) | ||
| 607 | { | ||
| 608 | int ret = 0; | ||
| 625 | union { | 609 | union { |
| 626 | struct sockaddr sa; | 610 | struct sockaddr sa; |
| 627 | struct sockaddr_in sa_in; | 611 | struct sockaddr_in sa_in; |
| 628 | #if OPENSSL_USE_IPV6 | 612 | #if OPENSSL_USE_IPV6 |
| 629 | struct sockaddr_in6 sa_in6; | 613 | struct sockaddr_in6 sa_in6; |
| 630 | #endif | 614 | #endif |
| 631 | } server,client; | 615 | } server, client; |
| 632 | int s=-1,cs,addrlen; | 616 | int s = -1, cs, addrlen; |
| 633 | unsigned char ip[4]; | 617 | unsigned char ip[4]; |
| 634 | unsigned short port; | 618 | unsigned short port; |
| 635 | char *str=NULL,*e; | 619 | char *str = NULL, *e; |
| 636 | char *h,*p; | 620 | char *h, *p; |
| 637 | unsigned long l; | 621 | unsigned long l; |
| 638 | int err_num; | 622 | int err_num; |
| 639 | 623 | ||
| 640 | if (BIO_sock_init() != 1) return(-1); | 624 | if (BIO_sock_init() != 1) |
| 625 | return (-1); | ||
| 641 | 626 | ||
| 642 | if ((str=BUF_strdup(host)) == NULL) return(-1); | 627 | if ((str = BUF_strdup(host)) == NULL) |
| 628 | return (-1); | ||
| 643 | 629 | ||
| 644 | h=p=NULL; | 630 | h = p = NULL; |
| 645 | h=str; | 631 | h = str; |
| 646 | for (e=str; *e; e++) | 632 | for (e = str; *e; e++) { |
| 647 | { | 633 | if (*e == ':') { |
| 648 | if (*e == ':') | 634 | p = e; |
| 649 | { | 635 | } else if (*e == '/') { |
| 650 | p=e; | 636 | *e = '\0'; |
| 651 | } | ||
| 652 | else if (*e == '/') | ||
| 653 | { | ||
| 654 | *e='\0'; | ||
| 655 | break; | 637 | break; |
| 656 | } | ||
| 657 | } | 638 | } |
| 658 | if (p) *p++='\0'; /* points at last ':', '::port' is special [see below] */ | 639 | } |
| 659 | else p=h,h=NULL; | 640 | if (p) |
| 641 | *p++='\0'; /* points at last ':', '::port' is special [see below] */ | ||
| 642 | else | ||
| 643 | p = h, h = NULL; | ||
| 660 | 644 | ||
| 661 | #ifdef EAI_FAMILY | 645 | #ifdef EAI_FAMILY |
| 662 | do { | 646 | do { |
| 663 | static union { void *p; | 647 | static union { |
| 664 | int (WSAAPI *f)(const char *,const char *, | 648 | void *p; |
| 665 | const struct addrinfo *, | 649 | int (WSAAPI *f)(const char *, const char *, |
| 666 | struct addrinfo **); | 650 | const struct addrinfo *, |
| 667 | } p_getaddrinfo = {NULL}; | 651 | struct addrinfo **); |
| 668 | static union { void *p; | 652 | } p_getaddrinfo = {NULL}; |
| 653 | static union { | ||
| 654 | void *p; | ||
| 669 | void (WSAAPI *f)(struct addrinfo *); | 655 | void (WSAAPI *f)(struct addrinfo *); |
| 670 | } p_freeaddrinfo = {NULL}; | 656 | } p_freeaddrinfo = {NULL}; |
| 671 | struct addrinfo *res,hint; | 657 | struct addrinfo *res, hint; |
| 672 | 658 | ||
| 673 | if (p_getaddrinfo.p==NULL) | 659 | if (p_getaddrinfo.p == NULL) { |
| 674 | { | 660 | if ((p_getaddrinfo.p = DSO_global_lookup("getaddrinfo"))==NULL || |
| 675 | if ((p_getaddrinfo.p=DSO_global_lookup("getaddrinfo"))==NULL || | 661 | (p_freeaddrinfo.p = DSO_global_lookup("freeaddrinfo"))==NULL) |
| 676 | (p_freeaddrinfo.p=DSO_global_lookup("freeaddrinfo"))==NULL) | 662 | p_getaddrinfo.p = (void*) - 1; |
| 677 | p_getaddrinfo.p=(void*)-1; | 663 | } |
| 678 | } | 664 | if (p_getaddrinfo.p == (void *) - 1) break; |
| 679 | if (p_getaddrinfo.p==(void *)-1) break; | 665 | |
| 680 | 666 | /* '::port' enforces IPv6 wildcard listener. Some OSes, | |
| 681 | /* '::port' enforces IPv6 wildcard listener. Some OSes, | 667 | * e.g. Solaris, default to IPv6 without any hint. Also |
| 682 | * e.g. Solaris, default to IPv6 without any hint. Also | 668 | * note that commonly IPv6 wildchard socket can service |
| 683 | * note that commonly IPv6 wildchard socket can service | 669 | * IPv4 connections just as well... */ |
| 684 | * IPv4 connections just as well... */ | 670 | memset(&hint, 0, sizeof(hint)); |
| 685 | memset(&hint,0,sizeof(hint)); | 671 | hint.ai_flags = AI_PASSIVE; |
| 686 | hint.ai_flags = AI_PASSIVE; | 672 | if (h) { |
| 687 | if (h) | 673 | if (strchr(h, ':')) { |
| 688 | { | 674 | if (h[1] == '\0') |
| 689 | if (strchr(h,':')) | 675 | h = NULL; |
| 690 | { | ||
| 691 | if (h[1]=='\0') h=NULL; | ||
| 692 | #if OPENSSL_USE_IPV6 | 676 | #if OPENSSL_USE_IPV6 |
| 693 | hint.ai_family = AF_INET6; | 677 | hint.ai_family = AF_INET6; |
| 694 | #else | 678 | #else |
| 695 | h=NULL; | 679 | h = NULL; |
| 696 | #endif | 680 | #endif |
| 697 | } | 681 | } else if (h[0] == '*' && h[1] == '\0') { |
| 698 | else if (h[0]=='*' && h[1]=='\0') | 682 | hint.ai_family = AF_INET; |
| 699 | { | 683 | h = NULL; |
| 700 | hint.ai_family = AF_INET; | ||
| 701 | h=NULL; | ||
| 702 | } | 684 | } |
| 703 | } | 685 | } |
| 704 | 686 | ||
| 705 | if ((*p_getaddrinfo.f)(h,p,&hint,&res)) break; | 687 | if ((*p_getaddrinfo.f)(h, p, &hint, &res)) |
| 688 | break; | ||
| 706 | 689 | ||
| 707 | addrlen = res->ai_addrlen<=sizeof(server) ? | 690 | addrlen = res->ai_addrlen <= sizeof(server) ? |
| 708 | res->ai_addrlen : | 691 | res->ai_addrlen : sizeof(server); |
| 709 | sizeof(server); | 692 | memcpy(&server, res->ai_addr, addrlen); |
| 710 | memcpy(&server, res->ai_addr, addrlen); | ||
| 711 | 693 | ||
| 712 | (*p_freeaddrinfo.f)(res); | 694 | (*p_freeaddrinfo.f)(res); |
| 713 | goto again; | 695 | goto again; |
| 714 | } while (0); | 696 | } while (0); |
| 715 | #endif | 697 | #endif |
| 716 | 698 | ||
| 717 | if (!BIO_get_port(p,&port)) goto err; | 699 | if (!BIO_get_port(p, &port)) |
| 700 | goto err; | ||
| 718 | 701 | ||
| 719 | memset((char *)&server,0,sizeof(server)); | 702 | memset((char *)&server, 0, sizeof(server)); |
| 720 | server.sa_in.sin_family=AF_INET; | 703 | server.sa_in.sin_family = AF_INET; |
| 721 | server.sa_in.sin_port=htons(port); | 704 | server.sa_in.sin_port = htons(port); |
| 722 | addrlen = sizeof(server.sa_in); | 705 | addrlen = sizeof(server.sa_in); |
| 723 | 706 | ||
| 724 | if (h == NULL || strcmp(h,"*") == 0) | 707 | if (h == NULL || strcmp(h, "*") == 0) |
| 725 | server.sa_in.sin_addr.s_addr=INADDR_ANY; | 708 | server.sa_in.sin_addr.s_addr = INADDR_ANY; |
| 726 | else | 709 | else { |
| 727 | { | 710 | if (!BIO_get_host_ip(h, &(ip[0]))) |
| 728 | if (!BIO_get_host_ip(h,&(ip[0]))) goto err; | 711 | goto err; |
| 729 | l=(unsigned long) | 712 | l = (unsigned long) |
| 730 | ((unsigned long)ip[0]<<24L)| | 713 | ((unsigned long)ip[0]<<24L)| |
| 731 | ((unsigned long)ip[1]<<16L)| | 714 | ((unsigned long)ip[1]<<16L)| |
| 732 | ((unsigned long)ip[2]<< 8L)| | 715 | ((unsigned long)ip[2]<< 8L)| |
| 733 | ((unsigned long)ip[3]); | 716 | ((unsigned long)ip[3]); |
| 734 | server.sa_in.sin_addr.s_addr=htonl(l); | 717 | server.sa_in.sin_addr.s_addr = htonl(l); |
| 735 | } | 718 | } |
| 736 | 719 | ||
| 737 | again: | 720 | again: |
| 738 | s=socket(server.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL); | 721 | s = socket(server.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL); |
| 739 | if (s == -1) | 722 | if (s == -1) { |
| 740 | { | 723 | SYSerr(SYS_F_SOCKET, errno); |
| 741 | SYSerr(SYS_F_SOCKET,errno); | 724 | ERR_add_error_data(3, "port = '", host, "'"); |
| 742 | ERR_add_error_data(3,"port='",host,"'"); | 725 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_CREATE_SOCKET); |
| 743 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET); | ||
| 744 | goto err; | 726 | goto err; |
| 745 | } | 727 | } |
| 746 | 728 | ||
| 747 | #ifdef SO_REUSEADDR | 729 | #ifdef SO_REUSEADDR |
| 748 | if (bind_mode == BIO_BIND_REUSEADDR) | 730 | if (bind_mode == BIO_BIND_REUSEADDR) { |
| 749 | { | 731 | int i = 1; |
| 750 | int i=1; | ||
| 751 | 732 | ||
| 752 | ret=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i)); | 733 | ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR,(char *)&i, sizeof(i)); |
| 753 | bind_mode=BIO_BIND_NORMAL; | 734 | bind_mode = BIO_BIND_NORMAL; |
| 754 | } | 735 | } |
| 755 | #endif | 736 | #endif |
| 756 | if (bind(s,&server.sa,addrlen) == -1) | 737 | if (bind(s, &server.sa, addrlen) == -1) { |
| 757 | { | ||
| 758 | #ifdef SO_REUSEADDR | 738 | #ifdef SO_REUSEADDR |
| 759 | err_num=errno; | 739 | err_num = errno; |
| 760 | if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) && | 740 | if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) && |
| 761 | #ifdef OPENSSL_SYS_WINDOWS | 741 | #ifdef OPENSSL_SYS_WINDOWS |
| 762 | /* Some versions of Windows define EADDRINUSE to | 742 | /* Some versions of Windows define EADDRINUSE to |
| 763 | * a dummy value. | 743 | * a dummy value. |
| 764 | */ | 744 | */ |
| 765 | (err_num == WSAEADDRINUSE)) | 745 | (err_num == WSAEADDRINUSE)) |
| 766 | #else | 746 | #else |
| 767 | (err_num == EADDRINUSE)) | 747 | (err_num == EADDRINUSE)) |
| 768 | #endif | 748 | #endif |
| 769 | { | 749 | { |
| 770 | client = server; | 750 | client = server; |
| 771 | if (h == NULL || strcmp(h,"*") == 0) | 751 | if (h == NULL || strcmp(h, "*") == 0) { |
| 772 | { | ||
| 773 | #if OPENSSL_USE_IPV6 | 752 | #if OPENSSL_USE_IPV6 |
| 774 | if (client.sa.sa_family == AF_INET6) | 753 | if (client.sa.sa_family == AF_INET6) { |
| 775 | { | 754 | memset(&client.sa_in6.sin6_addr, 0, sizeof(client.sa_in6.sin6_addr)); |
| 776 | memset(&client.sa_in6.sin6_addr,0,sizeof(client.sa_in6.sin6_addr)); | 755 | client.sa_in6.sin6_addr.s6_addr[15] = 1; |
| 777 | client.sa_in6.sin6_addr.s6_addr[15]=1; | 756 | } else |
| 778 | } | 757 | #endif |
| 779 | else | 758 | if (client.sa.sa_family == AF_INET) { |
| 780 | #endif | 759 | client.sa_in.sin_addr.s_addr = htonl(0x7F000001); |
| 781 | if (client.sa.sa_family == AF_INET) | 760 | } else |
| 782 | { | 761 | goto err; |
| 783 | client.sa_in.sin_addr.s_addr=htonl(0x7F000001); | 762 | } |
| 784 | } | 763 | cs = socket(client.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL); |
| 785 | else goto err; | 764 | if (cs != -1) { |
| 786 | } | ||
| 787 | cs=socket(client.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL); | ||
| 788 | if (cs != -1) | ||
| 789 | { | ||
| 790 | int ii; | 765 | int ii; |
| 791 | ii=connect(cs,&client.sa,addrlen); | 766 | ii = connect(cs, &client.sa, addrlen); |
| 792 | close(cs); | 767 | close(cs); |
| 793 | if (ii == -1) | 768 | if (ii == -1) { |
| 794 | { | 769 | bind_mode = BIO_BIND_REUSEADDR; |
| 795 | bind_mode=BIO_BIND_REUSEADDR; | ||
| 796 | close(s); | 770 | close(s); |
| 797 | goto again; | 771 | goto again; |
| 798 | } | ||
| 799 | /* else error */ | ||
| 800 | } | 772 | } |
| 801 | /* else error */ | 773 | /* else error */ |
| 802 | } | 774 | } |
| 775 | /* else error */ | ||
| 776 | } | ||
| 803 | #endif | 777 | #endif |
| 804 | SYSerr(SYS_F_BIND,err_num); | 778 | SYSerr(SYS_F_BIND, err_num); |
| 805 | ERR_add_error_data(3,"port='",host,"'"); | 779 | ERR_add_error_data(3, "port = '", host, "'"); |
| 806 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET); | 780 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_BIND_SOCKET); |
| 807 | goto err; | 781 | goto err; |
| 808 | } | 782 | } |
| 809 | if (listen(s,MAX_LISTEN) == -1) | 783 | if (listen(s, MAX_LISTEN) == -1) { |
| 810 | { | 784 | SYSerr(SYS_F_BIND, errno); |
| 811 | SYSerr(SYS_F_BIND,errno); | 785 | ERR_add_error_data(3, "port = '", host, "'"); |
| 812 | ERR_add_error_data(3,"port='",host,"'"); | 786 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_LISTEN_SOCKET); |
| 813 | BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_LISTEN_SOCKET); | ||
| 814 | goto err; | 787 | goto err; |
| 815 | } | 788 | } |
| 816 | ret=1; | 789 | ret = 1; |
| 817 | err: | 790 | err: |
| 818 | if (str != NULL) OPENSSL_free(str); | 791 | if (str != NULL) |
| 819 | if ((ret == 0) && (s != -1)) | 792 | OPENSSL_free(str); |
| 820 | { | 793 | if ((ret == 0) && (s != -1)) { |
| 821 | close(s); | 794 | close(s); |
| 822 | s= -1; | 795 | s = -1; |
| 823 | } | ||
| 824 | return(s); | ||
| 825 | } | 796 | } |
| 797 | return (s); | ||
| 798 | } | ||
| 826 | 799 | ||
| 827 | int BIO_accept(int sock, char **addr) | 800 | int |
| 828 | { | 801 | BIO_accept(int sock, char **addr) |
| 829 | int ret=-1; | 802 | { |
| 803 | int ret = -1; | ||
| 830 | unsigned long l; | 804 | unsigned long l; |
| 831 | unsigned short port; | 805 | unsigned short port; |
| 832 | char *p; | 806 | char *p; |
| 833 | 807 | ||
| 834 | struct { | 808 | struct { |
| 835 | /* | 809 | /* |
| 836 | * As for following union. Trouble is that there are platforms | 810 | * As for following union. Trouble is that there are platforms |
| 837 | * that have socklen_t and there are platforms that don't, on | 811 | * that have socklen_t and there are platforms that don't, on |
| 838 | * some platforms socklen_t is int and on some size_t. So what | 812 | * some platforms socklen_t is int and on some size_t. So what |
| 839 | * one can do? One can cook #ifdef spaghetti, which is nothing | 813 | * one can do? One can cook #ifdef spaghetti, which is nothing |
| 840 | * but masochistic. Or one can do union between int and size_t. | 814 | * but masochistic. Or one can do union between int and size_t. |
| 841 | * One naturally does it primarily for 64-bit platforms where | 815 | * One naturally does it primarily for 64-bit platforms where |
| 842 | * sizeof(int) != sizeof(size_t). But would it work? Note that | 816 | * sizeof(int) != sizeof(size_t). But would it work? Note that |
| 843 | * if size_t member is initialized to 0, then later int member | 817 | * if size_t member is initialized to 0, then later int member |
| 844 | * assignment naturally does the job on little-endian platforms | 818 | * assignment naturally does the job on little-endian platforms |
| 845 | * regardless accept's expectations! What about big-endians? | 819 | * regardless accept's expectations! What about big-endians? |
| 846 | * If accept expects int*, then it works, and if size_t*, then | 820 | * If accept expects int*, then it works, and if size_t*, then |
| 847 | * length value would appear as unreasonably large. But this | 821 | * length value would appear as unreasonably large. But this |
| 848 | * won't prevent it from filling in the address structure. The | 822 | * won't prevent it from filling in the address structure. The |
| 849 | * trouble of course would be if accept returns more data than | 823 | * trouble of course would be if accept returns more data than |
| 850 | * actual buffer can accomodate and overwrite stack... That's | 824 | * actual buffer can accomodate and overwrite stack... That's |
| 851 | * where early OPENSSL_assert comes into picture. Besides, the | 825 | * where early OPENSSL_assert comes into picture. Besides, the |
| 852 | * only 64-bit big-endian platform found so far that expects | 826 | * only 64-bit big-endian platform found so far that expects |
| 853 | * size_t* is HP-UX, where stack grows towards higher address. | 827 | * size_t* is HP-UX, where stack grows towards higher address. |
| 854 | * <appro> | 828 | * <appro> |
| 855 | */ | 829 | */ |
| 856 | union { size_t s; int i; } len; | 830 | union { |
| 857 | union { | 831 | size_t s; |
| 858 | struct sockaddr sa; | 832 | int i; |
| 859 | struct sockaddr_in sa_in; | 833 | } len; |
| 834 | union { | ||
| 835 | struct sockaddr sa; | ||
| 836 | struct sockaddr_in sa_in; | ||
| 860 | #if OPENSSL_USE_IPV6 | 837 | #if OPENSSL_USE_IPV6 |
| 861 | struct sockaddr_in6 sa_in6; | 838 | struct sockaddr_in6 sa_in6; |
| 862 | #endif | 839 | #endif |
| 863 | } from; | 840 | } from; |
| 864 | } sa; | 841 | } sa; |
| 865 | 842 | ||
| 866 | sa.len.s=0; | 843 | sa.len.s = 0; |
| 867 | sa.len.i=sizeof(sa.from); | 844 | sa.len.i = sizeof(sa.from); |
| 868 | memset(&sa.from,0,sizeof(sa.from)); | 845 | memset(&sa.from, 0, sizeof(sa.from)); |
| 869 | ret=accept(sock,&sa.from.sa,(void *)&sa.len); | 846 | ret = accept(sock, &sa.from.sa,(void *)&sa.len); |
| 870 | if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0) | 847 | if (sizeof(sa.len.i) != sizeof(sa.len.s) && sa.len.i == 0) { |
| 871 | { | 848 | OPENSSL_assert(sa.len.s <= sizeof(sa.from)); |
| 872 | OPENSSL_assert(sa.len.s<=sizeof(sa.from)); | ||
| 873 | sa.len.i = (int)sa.len.s; | 849 | sa.len.i = (int)sa.len.s; |
| 874 | /* use sa.len.i from this point */ | 850 | /* use sa.len.i from this point */ |
| 875 | } | 851 | } |
| 876 | if (ret == -1) | 852 | if (ret == -1) { |
| 877 | { | 853 | if (BIO_sock_should_retry(ret)) return -2; |
| 878 | if(BIO_sock_should_retry(ret)) return -2; | 854 | SYSerr(SYS_F_ACCEPT, errno); |
| 879 | SYSerr(SYS_F_ACCEPT,errno); | 855 | BIOerr(BIO_F_BIO_ACCEPT, BIO_R_ACCEPT_ERROR); |
| 880 | BIOerr(BIO_F_BIO_ACCEPT,BIO_R_ACCEPT_ERROR); | ||
| 881 | goto end; | 856 | goto end; |
| 882 | } | 857 | } |
| 883 | 858 | ||
| 884 | if (addr == NULL) goto end; | 859 | if (addr == NULL) |
| 860 | goto end; | ||
| 885 | 861 | ||
| 886 | #ifdef EAI_FAMILY | 862 | #ifdef EAI_FAMILY |
| 887 | do { | 863 | do { |
| 888 | char h[NI_MAXHOST],s[NI_MAXSERV]; | 864 | char h[NI_MAXHOST], s[NI_MAXSERV]; |
| 889 | size_t nl; | 865 | size_t nl; |
| 890 | static union { void *p; | 866 | static union { |
| 891 | int (WSAAPI *f)(const struct sockaddr *,size_t/*socklen_t*/, | 867 | void *p; |
| 892 | char *,size_t,char *,size_t,int); | 868 | int (WSAAPI *f)(const struct sockaddr *, |
| 893 | } p_getnameinfo = {NULL}; | 869 | size_t/*socklen_t*/, char *, size_t, |
| 894 | /* 2nd argument to getnameinfo is specified to | 870 | char *, size_t, int); |
| 895 | * be socklen_t. Unfortunately there is a number | 871 | } p_getnameinfo = {NULL}; |
| 896 | * of environments where socklen_t is not defined. | 872 | /* 2nd argument to getnameinfo is specified to |
| 897 | * As it's passed by value, it's safe to pass it | 873 | * be socklen_t. Unfortunately there is a number |
| 898 | * as size_t... <appro> */ | 874 | * of environments where socklen_t is not defined. |
| 899 | 875 | * As it's passed by value, it's safe to pass it | |
| 900 | if (p_getnameinfo.p==NULL) | 876 | * as size_t... <appro> */ |
| 901 | { | 877 | |
| 902 | if ((p_getnameinfo.p=DSO_global_lookup("getnameinfo"))==NULL) | 878 | if (p_getnameinfo.p == NULL) { |
| 903 | p_getnameinfo.p=(void*)-1; | 879 | if ((p_getnameinfo.p = DSO_global_lookup("getnameinfo")) == NULL) |
| 880 | p_getnameinfo.p = (void*) - 1; | ||
| 881 | } | ||
| 882 | if (p_getnameinfo.p == (void *) - 1) | ||
| 883 | break; | ||
| 884 | |||
| 885 | if ((*p_getnameinfo.f)(&sa.from.sa, sa.len.i, h, sizeof(h), | ||
| 886 | s, sizeof(s), NI_NUMERICHOST|NI_NUMERICSERV)) | ||
| 887 | break; | ||
| 888 | nl = strlen(h) + strlen(s) + 2; | ||
| 889 | p = *addr; | ||
| 890 | if (p) { | ||
| 891 | *p = '\0'; | ||
| 892 | p = OPENSSL_realloc(p, nl); | ||
| 893 | } else { | ||
| 894 | p = OPENSSL_malloc(nl); | ||
| 895 | } | ||
| 896 | if (p == NULL) { | ||
| 897 | BIOerr(BIO_F_BIO_ACCEPT, ERR_R_MALLOC_FAILURE); | ||
| 898 | goto end; | ||
| 904 | } | 899 | } |
| 905 | if (p_getnameinfo.p==(void *)-1) break; | 900 | *addr = p; |
| 906 | 901 | (void) snprintf(*addr, nl, "%s:%s", h, s); | |
| 907 | if ((*p_getnameinfo.f)(&sa.from.sa,sa.len.i,h,sizeof(h),s,sizeof(s), | ||
| 908 | NI_NUMERICHOST|NI_NUMERICSERV)) break; | ||
| 909 | nl = strlen(h)+strlen(s)+2; | ||
| 910 | p = *addr; | ||
| 911 | if (p) { *p = '\0'; p = OPENSSL_realloc(p,nl); } | ||
| 912 | else { p = OPENSSL_malloc(nl); } | ||
| 913 | if (p==NULL) | ||
| 914 | { | ||
| 915 | BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE); | ||
| 916 | goto end; | 902 | goto end; |
| 917 | } | 903 | } while (0); |
| 918 | *addr = p; | 904 | #endif |
| 919 | (void) snprintf(*addr,nl,"%s:%s",h,s); | 905 | if (sa.from.sa.sa_family != AF_INET) |
| 920 | goto end; | 906 | goto end; |
| 921 | } while(0); | 907 | l = ntohl(sa.from.sa_in.sin_addr.s_addr); |
| 922 | #endif | 908 | port = ntohs(sa.from.sa_in.sin_port); |
| 923 | if (sa.from.sa.sa_family != AF_INET) goto end; | 909 | if (*addr == NULL) { |
| 924 | l=ntohl(sa.from.sa_in.sin_addr.s_addr); | 910 | if ((p = OPENSSL_malloc(24)) == NULL) { |
| 925 | port=ntohs(sa.from.sa_in.sin_port); | 911 | BIOerr(BIO_F_BIO_ACCEPT, ERR_R_MALLOC_FAILURE); |
| 926 | if (*addr == NULL) | ||
| 927 | { | ||
| 928 | if ((p=OPENSSL_malloc(24)) == NULL) | ||
| 929 | { | ||
| 930 | BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE); | ||
| 931 | goto end; | 912 | goto end; |
| 932 | } | ||
| 933 | *addr=p; | ||
| 934 | } | 913 | } |
| 935 | (void) snprintf(*addr,24,"%d.%d.%d.%d:%d", | 914 | *addr = p; |
| 936 | (unsigned char)(l>>24L)&0xff, | ||
| 937 | (unsigned char)(l>>16L)&0xff, | ||
| 938 | (unsigned char)(l>> 8L)&0xff, | ||
| 939 | (unsigned char)(l )&0xff, | ||
| 940 | port); | ||
| 941 | end: | ||
| 942 | return(ret); | ||
| 943 | } | 915 | } |
| 916 | (void) snprintf(*addr, 24, "%d.%d.%d.%d:%d", | ||
| 917 | (unsigned char)(l >> 24L) & 0xff, (unsigned char)(l >> 16L) & 0xff, | ||
| 918 | (unsigned char)(l >> 8L) & 0xff, (unsigned char)(l) & 0xff, port); | ||
| 944 | 919 | ||
| 945 | int BIO_set_tcp_ndelay(int s, int on) | 920 | end: |
| 946 | { | 921 | return (ret); |
| 947 | int ret=0; | 922 | } |
| 923 | |||
| 924 | int | ||
| 925 | BIO_set_tcp_ndelay(int s, int on) | ||
| 926 | { | ||
| 927 | int ret = 0; | ||
| 948 | #if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP)) | 928 | #if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP)) |
| 949 | int opt; | 929 | int opt; |
| 950 | 930 | ||
| 951 | #ifdef SOL_TCP | 931 | #ifdef SOL_TCP |
| 952 | opt=SOL_TCP; | 932 | opt = SOL_TCP; |
| 953 | #else | 933 | #else |
| 954 | #ifdef IPPROTO_TCP | 934 | #ifdef IPPROTO_TCP |
| 955 | opt=IPPROTO_TCP; | 935 | opt = IPPROTO_TCP; |
| 956 | #endif | 936 | #endif |
| 957 | #endif | 937 | #endif |
| 958 | 938 | ||
| 959 | ret=setsockopt(s,opt,TCP_NODELAY,(char *)&on,sizeof(on)); | 939 | ret = setsockopt(s, opt, TCP_NODELAY,(char *)&on, sizeof(on)); |
| 960 | #endif | 940 | #endif |
| 961 | return(ret == 0); | 941 | return (ret == 0); |
| 962 | } | 942 | } |
| 963 | 943 | ||
| 964 | int BIO_socket_nbio(int s, int mode) | 944 | int |
| 965 | { | 945 | BIO_socket_nbio(int s, int mode) |
| 966 | int ret= -1; | 946 | { |
| 947 | int ret = -1; | ||
| 967 | int l; | 948 | int l; |
| 968 | 949 | ||
| 969 | l=mode; | 950 | l = mode; |
| 970 | #ifdef FIONBIO | 951 | #ifdef FIONBIO |
| 971 | ret=BIO_socket_ioctl(s,FIONBIO,&l); | 952 | ret = BIO_socket_ioctl(s, FIONBIO, &l); |
| 972 | #endif | 953 | #endif |
| 973 | return(ret == 0); | 954 | return (ret == 0); |
| 974 | } | 955 | } |
| 975 | #endif | 956 | #endif |
diff --git a/src/lib/libssl/src/crypto/bio/bf_buff.c b/src/lib/libssl/src/crypto/bio/bf_buff.c index 4b5a132d8a..9518cf977e 100644 --- a/src/lib/libssl/src/crypto/bio/bf_buff.c +++ b/src/lib/libssl/src/crypto/bio/bf_buff.c | |||
| @@ -61,7 +61,7 @@ | |||
| 61 | #include "cryptlib.h" | 61 | #include "cryptlib.h" |
| 62 | #include <openssl/bio.h> | 62 | #include <openssl/bio.h> |
| 63 | 63 | ||
| 64 | static int buffer_write(BIO *h, const char *buf,int num); | 64 | static int buffer_write(BIO *h, const char *buf, int num); |
| 65 | static int buffer_read(BIO *h, char *buf, int size); | 65 | static int buffer_read(BIO *h, char *buf, int size); |
| 66 | static int buffer_puts(BIO *h, const char *str); | 66 | static int buffer_puts(BIO *h, const char *str); |
| 67 | static int buffer_gets(BIO *h, char *str, int size); | 67 | static int buffer_gets(BIO *h, char *str, int size); |
| @@ -71,8 +71,7 @@ static int buffer_free(BIO *data); | |||
| 71 | static long buffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); | 71 | static long buffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); |
| 72 | #define DEFAULT_BUFFER_SIZE 4096 | 72 | #define DEFAULT_BUFFER_SIZE 4096 |
| 73 | 73 | ||
| 74 | static BIO_METHOD methods_buffer= | 74 | static BIO_METHOD methods_buffer = { |
| 75 | { | ||
| 76 | BIO_TYPE_BUFFER, | 75 | BIO_TYPE_BUFFER, |
| 77 | "buffer", | 76 | "buffer", |
| 78 | buffer_write, | 77 | buffer_write, |
| @@ -83,430 +82,444 @@ static BIO_METHOD methods_buffer= | |||
| 83 | buffer_new, | 82 | buffer_new, |
| 84 | buffer_free, | 83 | buffer_free, |
| 85 | buffer_callback_ctrl, | 84 | buffer_callback_ctrl, |
| 86 | }; | 85 | }; |
| 87 | 86 | ||
| 88 | BIO_METHOD *BIO_f_buffer(void) | 87 | BIO_METHOD |
| 89 | { | 88 | *BIO_f_buffer(void) |
| 90 | return(&methods_buffer); | 89 | { |
| 91 | } | 90 | return (&methods_buffer); |
| 91 | } | ||
| 92 | 92 | ||
| 93 | static int buffer_new(BIO *bi) | 93 | static int |
| 94 | { | 94 | buffer_new(BIO *bi) |
| 95 | { | ||
| 95 | BIO_F_BUFFER_CTX *ctx; | 96 | BIO_F_BUFFER_CTX *ctx; |
| 96 | 97 | ||
| 97 | ctx=(BIO_F_BUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_F_BUFFER_CTX)); | 98 | ctx = (BIO_F_BUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_F_BUFFER_CTX)); |
| 98 | if (ctx == NULL) return(0); | 99 | if (ctx == NULL) |
| 99 | ctx->ibuf=(char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); | 100 | return (0); |
| 100 | if (ctx->ibuf == NULL) { OPENSSL_free(ctx); return(0); } | 101 | ctx->ibuf = (char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); |
| 101 | ctx->obuf=(char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); | 102 | if (ctx->ibuf == NULL) { |
| 102 | if (ctx->obuf == NULL) { OPENSSL_free(ctx->ibuf); OPENSSL_free(ctx); return(0); } | 103 | OPENSSL_free(ctx); |
| 103 | ctx->ibuf_size=DEFAULT_BUFFER_SIZE; | 104 | return (0); |
| 104 | ctx->obuf_size=DEFAULT_BUFFER_SIZE; | ||
| 105 | ctx->ibuf_len=0; | ||
| 106 | ctx->ibuf_off=0; | ||
| 107 | ctx->obuf_len=0; | ||
| 108 | ctx->obuf_off=0; | ||
| 109 | |||
| 110 | bi->init=1; | ||
| 111 | bi->ptr=(char *)ctx; | ||
| 112 | bi->flags=0; | ||
| 113 | return(1); | ||
| 114 | } | 105 | } |
| 115 | 106 | ctx->obuf = (char *)OPENSSL_malloc(DEFAULT_BUFFER_SIZE); | |
| 116 | static int buffer_free(BIO *a) | 107 | if (ctx->obuf == NULL) { |
| 117 | { | 108 | OPENSSL_free(ctx->ibuf); |
| 109 | OPENSSL_free(ctx); | ||
| 110 | return (0); | ||
| 111 | } | ||
| 112 | ctx->ibuf_size = DEFAULT_BUFFER_SIZE; | ||
| 113 | ctx->obuf_size = DEFAULT_BUFFER_SIZE; | ||
| 114 | ctx->ibuf_len = 0; | ||
| 115 | ctx->ibuf_off = 0; | ||
| 116 | ctx->obuf_len = 0; | ||
| 117 | ctx->obuf_off = 0; | ||
| 118 | |||
| 119 | bi->init = 1; | ||
| 120 | bi->ptr = (char *)ctx; | ||
| 121 | bi->flags = 0; | ||
| 122 | return (1); | ||
| 123 | } | ||
| 124 | |||
| 125 | static int | ||
| 126 | buffer_free(BIO *a) | ||
| 127 | { | ||
| 118 | BIO_F_BUFFER_CTX *b; | 128 | BIO_F_BUFFER_CTX *b; |
| 119 | 129 | ||
| 120 | if (a == NULL) return(0); | 130 | if (a == NULL) |
| 121 | b=(BIO_F_BUFFER_CTX *)a->ptr; | 131 | return (0); |
| 122 | if (b->ibuf != NULL) OPENSSL_free(b->ibuf); | 132 | b = (BIO_F_BUFFER_CTX *)a->ptr; |
| 123 | if (b->obuf != NULL) OPENSSL_free(b->obuf); | 133 | if (b->ibuf != NULL) |
| 134 | OPENSSL_free(b->ibuf); | ||
| 135 | if (b->obuf != NULL) | ||
| 136 | OPENSSL_free(b->obuf); | ||
| 124 | OPENSSL_free(a->ptr); | 137 | OPENSSL_free(a->ptr); |
| 125 | a->ptr=NULL; | 138 | a->ptr = NULL; |
| 126 | a->init=0; | 139 | a->init = 0; |
| 127 | a->flags=0; | 140 | a->flags = 0; |
| 128 | return(1); | 141 | return (1); |
| 129 | } | 142 | } |
| 130 | 143 | ||
| 131 | static int buffer_read(BIO *b, char *out, int outl) | 144 | static int |
| 132 | { | 145 | buffer_read(BIO *b, char *out, int outl) |
| 133 | int i,num=0; | 146 | { |
| 147 | int i, num = 0; | ||
| 134 | BIO_F_BUFFER_CTX *ctx; | 148 | BIO_F_BUFFER_CTX *ctx; |
| 135 | 149 | ||
| 136 | if (out == NULL) return(0); | 150 | if (out == NULL) |
| 137 | ctx=(BIO_F_BUFFER_CTX *)b->ptr; | 151 | return (0); |
| 152 | ctx = (BIO_F_BUFFER_CTX *)b->ptr; | ||
| 138 | 153 | ||
| 139 | if ((ctx == NULL) || (b->next_bio == NULL)) return(0); | 154 | if ((ctx == NULL) || (b->next_bio == NULL)) |
| 140 | num=0; | 155 | return (0); |
| 156 | num = 0; | ||
| 141 | BIO_clear_retry_flags(b); | 157 | BIO_clear_retry_flags(b); |
| 142 | 158 | ||
| 143 | start: | 159 | start: |
| 144 | i=ctx->ibuf_len; | 160 | i = ctx->ibuf_len; |
| 145 | /* If there is stuff left over, grab it */ | 161 | /* If there is stuff left over, grab it */ |
| 146 | if (i != 0) | 162 | if (i != 0) { |
| 147 | { | 163 | if (i > outl) |
| 148 | if (i > outl) i=outl; | 164 | i = outl; |
| 149 | memcpy(out,&(ctx->ibuf[ctx->ibuf_off]),i); | 165 | memcpy(out, &(ctx->ibuf[ctx->ibuf_off]), i); |
| 150 | ctx->ibuf_off+=i; | 166 | ctx->ibuf_off += i; |
| 151 | ctx->ibuf_len-=i; | 167 | ctx->ibuf_len -= i; |
| 152 | num+=i; | 168 | num += i; |
| 153 | if (outl == i) return(num); | 169 | if (outl == i) |
| 154 | outl-=i; | 170 | return (num); |
| 155 | out+=i; | 171 | outl -= i; |
| 156 | } | 172 | out += i; |
| 173 | } | ||
| 157 | 174 | ||
| 158 | /* We may have done a partial read. try to do more. | 175 | /* We may have done a partial read. try to do more. |
| 159 | * We have nothing in the buffer. | 176 | * We have nothing in the buffer. |
| 160 | * If we get an error and have read some data, just return it | 177 | * If we get an error and have read some data, just return it |
| 161 | * and let them retry to get the error again. | 178 | * and let them retry to get the error again. |
| 162 | * copy direct to parent address space */ | 179 | * copy direct to parent address space */ |
| 163 | if (outl > ctx->ibuf_size) | 180 | if (outl > ctx->ibuf_size) { |
| 164 | { | 181 | for (;;) { |
| 165 | for (;;) | 182 | i = BIO_read(b->next_bio, out, outl); |
| 166 | { | 183 | if (i <= 0) { |
| 167 | i=BIO_read(b->next_bio,out,outl); | ||
| 168 | if (i <= 0) | ||
| 169 | { | ||
| 170 | BIO_copy_next_retry(b); | 184 | BIO_copy_next_retry(b); |
| 171 | if (i < 0) return((num > 0)?num:i); | 185 | if (i < 0) |
| 172 | if (i == 0) return(num); | 186 | return ((num > 0) ? num : i); |
| 173 | } | 187 | if (i == 0) |
| 174 | num+=i; | 188 | return (num); |
| 175 | if (outl == i) return(num); | ||
| 176 | out+=i; | ||
| 177 | outl-=i; | ||
| 178 | } | 189 | } |
| 190 | num += i; | ||
| 191 | if (outl == i) | ||
| 192 | return (num); | ||
| 193 | out += i; | ||
| 194 | outl -= i; | ||
| 179 | } | 195 | } |
| 196 | } | ||
| 180 | /* else */ | 197 | /* else */ |
| 181 | 198 | ||
| 182 | /* we are going to be doing some buffering */ | 199 | /* we are going to be doing some buffering */ |
| 183 | i=BIO_read(b->next_bio,ctx->ibuf,ctx->ibuf_size); | 200 | i = BIO_read(b->next_bio, ctx->ibuf, ctx->ibuf_size); |
| 184 | if (i <= 0) | 201 | if (i <= 0) { |
| 185 | { | ||
| 186 | BIO_copy_next_retry(b); | 202 | BIO_copy_next_retry(b); |
| 187 | if (i < 0) return((num > 0)?num:i); | 203 | if (i < 0) |
| 188 | if (i == 0) return(num); | 204 | return ((num > 0) ? num : i); |
| 189 | } | 205 | if (i == 0) |
| 190 | ctx->ibuf_off=0; | 206 | return (num); |
| 191 | ctx->ibuf_len=i; | 207 | } |
| 208 | ctx->ibuf_off = 0; | ||
| 209 | ctx->ibuf_len = i; | ||
| 192 | 210 | ||
| 193 | /* Lets re-read using ourselves :-) */ | 211 | /* Lets re-read using ourselves :-) */ |
| 194 | goto start; | 212 | goto start; |
| 195 | } | 213 | } |
| 196 | 214 | ||
| 197 | static int buffer_write(BIO *b, const char *in, int inl) | 215 | static int |
| 198 | { | 216 | buffer_write(BIO *b, const char *in, int inl) |
| 199 | int i,num=0; | 217 | { |
| 218 | int i, num = 0; | ||
| 200 | BIO_F_BUFFER_CTX *ctx; | 219 | BIO_F_BUFFER_CTX *ctx; |
| 201 | 220 | ||
| 202 | if ((in == NULL) || (inl <= 0)) return(0); | 221 | if ((in == NULL) || (inl <= 0)) |
| 203 | ctx=(BIO_F_BUFFER_CTX *)b->ptr; | 222 | return (0); |
| 204 | if ((ctx == NULL) || (b->next_bio == NULL)) return(0); | 223 | ctx = (BIO_F_BUFFER_CTX *)b->ptr; |
| 224 | if ((ctx == NULL) || (b->next_bio == NULL)) | ||
| 225 | return (0); | ||
| 205 | 226 | ||
| 206 | BIO_clear_retry_flags(b); | 227 | BIO_clear_retry_flags(b); |
| 207 | start: | 228 | start: |
| 208 | i=ctx->obuf_size-(ctx->obuf_len+ctx->obuf_off); | 229 | i = ctx->obuf_size - (ctx->obuf_len + ctx->obuf_off); |
| 209 | /* add to buffer and return */ | 230 | /* add to buffer and return */ |
| 210 | if (i >= inl) | 231 | if (i >= inl) { |
| 211 | { | 232 | memcpy(&(ctx->obuf[ctx->obuf_off + ctx->obuf_len]), in, inl); |
| 212 | memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,inl); | 233 | ctx->obuf_len += inl; |
| 213 | ctx->obuf_len+=inl; | 234 | return (num + inl); |
| 214 | return(num+inl); | 235 | } |
| 215 | } | ||
| 216 | /* else */ | 236 | /* else */ |
| 217 | /* stuff already in buffer, so add to it first, then flush */ | 237 | /* stuff already in buffer, so add to it first, then flush */ |
| 218 | if (ctx->obuf_len != 0) | 238 | if (ctx->obuf_len != 0) { |
| 219 | { | ||
| 220 | if (i > 0) /* lets fill it up if we can */ | 239 | if (i > 0) /* lets fill it up if we can */ |
| 221 | { | 240 | { |
| 222 | memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,i); | 241 | memcpy(&(ctx->obuf[ctx->obuf_off + ctx->obuf_len]), in, i); |
| 223 | in+=i; | 242 | in += i; |
| 224 | inl-=i; | 243 | inl -= i; |
| 225 | num+=i; | 244 | num += i; |
| 226 | ctx->obuf_len+=i; | 245 | ctx->obuf_len += i; |
| 227 | } | 246 | } |
| 228 | /* we now have a full buffer needing flushing */ | 247 | /* we now have a full buffer needing flushing */ |
| 229 | for (;;) | 248 | for (;;) { |
| 230 | { | 249 | i = BIO_write(b->next_bio, &(ctx->obuf[ctx->obuf_off]), |
| 231 | i=BIO_write(b->next_bio,&(ctx->obuf[ctx->obuf_off]), | 250 | ctx->obuf_len); |
| 232 | ctx->obuf_len); | 251 | if (i <= 0) { |
| 233 | if (i <= 0) | ||
| 234 | { | ||
| 235 | BIO_copy_next_retry(b); | 252 | BIO_copy_next_retry(b); |
| 236 | 253 | ||
| 237 | if (i < 0) return((num > 0)?num:i); | 254 | if (i < 0) |
| 238 | if (i == 0) return(num); | 255 | return ((num > 0) ? num : i); |
| 239 | } | 256 | if (i == 0) |
| 240 | ctx->obuf_off+=i; | 257 | return (num); |
| 241 | ctx->obuf_len-=i; | ||
| 242 | if (ctx->obuf_len == 0) break; | ||
| 243 | } | 258 | } |
| 259 | ctx->obuf_off += i; | ||
| 260 | ctx->obuf_len -= i; | ||
| 261 | if (ctx->obuf_len == 0) | ||
| 262 | break; | ||
| 244 | } | 263 | } |
| 264 | } | ||
| 245 | /* we only get here if the buffer has been flushed and we | 265 | /* we only get here if the buffer has been flushed and we |
| 246 | * still have stuff to write */ | 266 | * still have stuff to write */ |
| 247 | ctx->obuf_off=0; | 267 | ctx->obuf_off = 0; |
| 248 | 268 | ||
| 249 | /* we now have inl bytes to write */ | 269 | /* we now have inl bytes to write */ |
| 250 | while (inl >= ctx->obuf_size) | 270 | while (inl >= ctx->obuf_size) { |
| 251 | { | 271 | i = BIO_write(b->next_bio, in, inl); |
| 252 | i=BIO_write(b->next_bio,in,inl); | 272 | if (i <= 0) { |
| 253 | if (i <= 0) | ||
| 254 | { | ||
| 255 | BIO_copy_next_retry(b); | 273 | BIO_copy_next_retry(b); |
| 256 | if (i < 0) return((num > 0)?num:i); | 274 | if (i < 0) |
| 257 | if (i == 0) return(num); | 275 | return ((num > 0) ? num : i); |
| 258 | } | 276 | if (i == 0) |
| 259 | num+=i; | 277 | return (num); |
| 260 | in+=i; | ||
| 261 | inl-=i; | ||
| 262 | if (inl == 0) return(num); | ||
| 263 | } | 278 | } |
| 279 | num += i; | ||
| 280 | in += i; | ||
| 281 | inl -= i; | ||
| 282 | if (inl == 0) | ||
| 283 | return (num); | ||
| 284 | } | ||
| 264 | 285 | ||
| 265 | /* copy the rest into the buffer since we have only a small | 286 | /* copy the rest into the buffer since we have only a small |
| 266 | * amount left */ | 287 | * amount left */ |
| 267 | goto start; | 288 | goto start; |
| 268 | } | 289 | } |
| 269 | 290 | ||
| 270 | static long buffer_ctrl(BIO *b, int cmd, long num, void *ptr) | 291 | static long |
| 271 | { | 292 | buffer_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 293 | { | ||
| 272 | BIO *dbio; | 294 | BIO *dbio; |
| 273 | BIO_F_BUFFER_CTX *ctx; | 295 | BIO_F_BUFFER_CTX *ctx; |
| 274 | long ret=1; | 296 | long ret = 1; |
| 275 | char *p1,*p2; | 297 | char *p1, *p2; |
| 276 | int r,i,*ip; | 298 | int r, i, *ip; |
| 277 | int ibs,obs; | 299 | int ibs, obs; |
| 278 | 300 | ||
| 279 | ctx=(BIO_F_BUFFER_CTX *)b->ptr; | 301 | ctx = (BIO_F_BUFFER_CTX *)b->ptr; |
| 280 | 302 | ||
| 281 | switch (cmd) | 303 | switch (cmd) { |
| 282 | { | ||
| 283 | case BIO_CTRL_RESET: | 304 | case BIO_CTRL_RESET: |
| 284 | ctx->ibuf_off=0; | 305 | ctx->ibuf_off = 0; |
| 285 | ctx->ibuf_len=0; | 306 | ctx->ibuf_len = 0; |
| 286 | ctx->obuf_off=0; | 307 | ctx->obuf_off = 0; |
| 287 | ctx->obuf_len=0; | 308 | ctx->obuf_len = 0; |
| 288 | if (b->next_bio == NULL) return(0); | 309 | if (b->next_bio == NULL) |
| 289 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 310 | return (0); |
| 311 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); | ||
| 290 | break; | 312 | break; |
| 291 | case BIO_CTRL_INFO: | 313 | case BIO_CTRL_INFO: |
| 292 | ret=(long)ctx->obuf_len; | 314 | ret = (long)ctx->obuf_len; |
| 293 | break; | 315 | break; |
| 294 | case BIO_C_GET_BUFF_NUM_LINES: | 316 | case BIO_C_GET_BUFF_NUM_LINES: |
| 295 | ret=0; | 317 | ret = 0; |
| 296 | p1=ctx->ibuf; | 318 | p1 = ctx->ibuf; |
| 297 | for (i=0; i<ctx->ibuf_len; i++) | 319 | for (i = 0; i < ctx->ibuf_len; i++) { |
| 298 | { | 320 | if (p1[ctx->ibuf_off + i] == '\n') |
| 299 | if (p1[ctx->ibuf_off + i] == '\n') ret++; | 321 | ret++; |
| 300 | } | 322 | } |
| 301 | break; | 323 | break; |
| 302 | case BIO_CTRL_WPENDING: | 324 | case BIO_CTRL_WPENDING: |
| 303 | ret=(long)ctx->obuf_len; | 325 | ret = (long)ctx->obuf_len; |
| 304 | if (ret == 0) | 326 | if (ret == 0) { |
| 305 | { | 327 | if (b->next_bio == NULL) |
| 306 | if (b->next_bio == NULL) return(0); | 328 | return (0); |
| 307 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 329 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 308 | } | 330 | } |
| 309 | break; | 331 | break; |
| 310 | case BIO_CTRL_PENDING: | 332 | case BIO_CTRL_PENDING: |
| 311 | ret=(long)ctx->ibuf_len; | 333 | ret = (long)ctx->ibuf_len; |
| 312 | if (ret == 0) | 334 | if (ret == 0) { |
| 313 | { | 335 | if (b->next_bio == NULL) |
| 314 | if (b->next_bio == NULL) return(0); | 336 | return (0); |
| 315 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 337 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 316 | } | 338 | } |
| 317 | break; | 339 | break; |
| 318 | case BIO_C_SET_BUFF_READ_DATA: | 340 | case BIO_C_SET_BUFF_READ_DATA: |
| 319 | if (num > ctx->ibuf_size) | 341 | if (num > ctx->ibuf_size) { |
| 320 | { | 342 | p1 = OPENSSL_malloc((int)num); |
| 321 | p1=OPENSSL_malloc((int)num); | 343 | if (p1 == NULL) |
| 322 | if (p1 == NULL) goto malloc_error; | 344 | goto malloc_error; |
| 323 | if (ctx->ibuf != NULL) OPENSSL_free(ctx->ibuf); | 345 | if (ctx->ibuf != NULL) |
| 324 | ctx->ibuf=p1; | 346 | OPENSSL_free(ctx->ibuf); |
| 325 | } | 347 | ctx->ibuf = p1; |
| 326 | ctx->ibuf_off=0; | 348 | } |
| 327 | ctx->ibuf_len=(int)num; | 349 | ctx->ibuf_off = 0; |
| 328 | memcpy(ctx->ibuf,ptr,(int)num); | 350 | ctx->ibuf_len = (int)num; |
| 329 | ret=1; | 351 | memcpy(ctx->ibuf, ptr,(int)num); |
| 352 | ret = 1; | ||
| 330 | break; | 353 | break; |
| 331 | case BIO_C_SET_BUFF_SIZE: | 354 | case BIO_C_SET_BUFF_SIZE: |
| 332 | if (ptr != NULL) | 355 | if (ptr != NULL) { |
| 333 | { | 356 | ip = (int *)ptr; |
| 334 | ip=(int *)ptr; | 357 | if (*ip == 0) { |
| 335 | if (*ip == 0) | 358 | ibs = (int)num; |
| 336 | { | 359 | obs = ctx->obuf_size; |
| 337 | ibs=(int)num; | ||
| 338 | obs=ctx->obuf_size; | ||
| 339 | } | ||
| 340 | else /* if (*ip == 1) */ | ||
| 341 | { | ||
| 342 | ibs=ctx->ibuf_size; | ||
| 343 | obs=(int)num; | ||
| 344 | } | ||
| 345 | } | ||
| 346 | else | ||
| 347 | { | ||
| 348 | ibs=(int)num; | ||
| 349 | obs=(int)num; | ||
| 350 | } | 360 | } |
| 351 | p1=ctx->ibuf; | 361 | else /* if (*ip == 1) */ |
| 352 | p2=ctx->obuf; | ||
| 353 | if ((ibs > DEFAULT_BUFFER_SIZE) && (ibs != ctx->ibuf_size)) | ||
| 354 | { | 362 | { |
| 355 | p1=(char *)OPENSSL_malloc((int)num); | 363 | ibs = ctx->ibuf_size; |
| 356 | if (p1 == NULL) goto malloc_error; | 364 | obs = (int)num; |
| 357 | } | 365 | } |
| 358 | if ((obs > DEFAULT_BUFFER_SIZE) && (obs != ctx->obuf_size)) | 366 | } else { |
| 359 | { | 367 | ibs = (int)num; |
| 360 | p2=(char *)OPENSSL_malloc((int)num); | 368 | obs = (int)num; |
| 361 | if (p2 == NULL) | 369 | } |
| 362 | { | 370 | p1 = ctx->ibuf; |
| 363 | if (p1 != ctx->ibuf) OPENSSL_free(p1); | 371 | p2 = ctx->obuf; |
| 372 | if ((ibs > DEFAULT_BUFFER_SIZE) && (ibs != ctx->ibuf_size)) { | ||
| 373 | p1 = (char *)OPENSSL_malloc((int)num); | ||
| 374 | if (p1 == NULL) | ||
| 375 | goto malloc_error; | ||
| 376 | } | ||
| 377 | if ((obs > DEFAULT_BUFFER_SIZE) && (obs != ctx->obuf_size)) { | ||
| 378 | p2 = (char *)OPENSSL_malloc((int)num); | ||
| 379 | if (p2 == NULL) { | ||
| 380 | if (p1 != ctx->ibuf) | ||
| 381 | OPENSSL_free(p1); | ||
| 364 | goto malloc_error; | 382 | goto malloc_error; |
| 365 | } | ||
| 366 | } | 383 | } |
| 367 | if (ctx->ibuf != p1) | 384 | } |
| 368 | { | 385 | if (ctx->ibuf != p1) { |
| 369 | OPENSSL_free(ctx->ibuf); | 386 | OPENSSL_free(ctx->ibuf); |
| 370 | ctx->ibuf=p1; | 387 | ctx->ibuf = p1; |
| 371 | ctx->ibuf_off=0; | 388 | ctx->ibuf_off = 0; |
| 372 | ctx->ibuf_len=0; | 389 | ctx->ibuf_len = 0; |
| 373 | ctx->ibuf_size=ibs; | 390 | ctx->ibuf_size = ibs; |
| 374 | } | 391 | } |
| 375 | if (ctx->obuf != p2) | 392 | if (ctx->obuf != p2) { |
| 376 | { | ||
| 377 | OPENSSL_free(ctx->obuf); | 393 | OPENSSL_free(ctx->obuf); |
| 378 | ctx->obuf=p2; | 394 | ctx->obuf = p2; |
| 379 | ctx->obuf_off=0; | 395 | ctx->obuf_off = 0; |
| 380 | ctx->obuf_len=0; | 396 | ctx->obuf_len = 0; |
| 381 | ctx->obuf_size=obs; | 397 | ctx->obuf_size = obs; |
| 382 | } | 398 | } |
| 383 | break; | 399 | break; |
| 384 | case BIO_C_DO_STATE_MACHINE: | 400 | case BIO_C_DO_STATE_MACHINE: |
| 385 | if (b->next_bio == NULL) return(0); | 401 | if (b->next_bio == NULL) |
| 402 | return (0); | ||
| 386 | BIO_clear_retry_flags(b); | 403 | BIO_clear_retry_flags(b); |
| 387 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 404 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 388 | BIO_copy_next_retry(b); | 405 | BIO_copy_next_retry(b); |
| 389 | break; | 406 | break; |
| 390 | 407 | ||
| 391 | case BIO_CTRL_FLUSH: | 408 | case BIO_CTRL_FLUSH: |
| 392 | if (b->next_bio == NULL) return(0); | 409 | if (b->next_bio == NULL) |
| 393 | if (ctx->obuf_len <= 0) | 410 | return (0); |
| 394 | { | 411 | if (ctx->obuf_len <= 0) { |
| 395 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 412 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 396 | break; | 413 | break; |
| 397 | } | 414 | } |
| 398 | 415 | ||
| 399 | for (;;) | 416 | for (;;) { |
| 400 | { | ||
| 401 | BIO_clear_retry_flags(b); | 417 | BIO_clear_retry_flags(b); |
| 402 | if (ctx->obuf_len > 0) | 418 | if (ctx->obuf_len > 0) { |
| 403 | { | 419 | r = BIO_write(b->next_bio, |
| 404 | r=BIO_write(b->next_bio, | 420 | &(ctx->obuf[ctx->obuf_off]), |
| 405 | &(ctx->obuf[ctx->obuf_off]), | 421 | ctx->obuf_len); |
| 406 | ctx->obuf_len); | ||
| 407 | #if 0 | 422 | #if 0 |
| 408 | fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len,r); | 423 | fprintf(stderr, "FLUSH [%3d] %3d -> %3d\n", ctx->obuf_off, ctx->obuf_len, r); |
| 409 | #endif | 424 | #endif |
| 410 | BIO_copy_next_retry(b); | 425 | BIO_copy_next_retry(b); |
| 411 | if (r <= 0) return((long)r); | 426 | if (r <= 0) |
| 412 | ctx->obuf_off+=r; | 427 | return ((long)r); |
| 413 | ctx->obuf_len-=r; | 428 | ctx->obuf_off += r; |
| 414 | } | 429 | ctx->obuf_len -= r; |
| 415 | else | 430 | } else { |
| 416 | { | 431 | ctx->obuf_len = 0; |
| 417 | ctx->obuf_len=0; | 432 | ctx->obuf_off = 0; |
| 418 | ctx->obuf_off=0; | 433 | ret = 1; |
| 419 | ret=1; | ||
| 420 | break; | 434 | break; |
| 421 | } | ||
| 422 | } | 435 | } |
| 423 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 436 | } |
| 437 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); | ||
| 424 | break; | 438 | break; |
| 425 | case BIO_CTRL_DUP: | 439 | case BIO_CTRL_DUP: |
| 426 | dbio=(BIO *)ptr; | 440 | dbio = (BIO *)ptr; |
| 427 | if ( !BIO_set_read_buffer_size(dbio,ctx->ibuf_size) || | 441 | if (!BIO_set_read_buffer_size(dbio, ctx->ibuf_size) || |
| 428 | !BIO_set_write_buffer_size(dbio,ctx->obuf_size)) | 442 | !BIO_set_write_buffer_size(dbio, ctx->obuf_size)) |
| 429 | ret=0; | 443 | ret = 0; |
| 430 | break; | 444 | break; |
| 431 | default: | 445 | default: |
| 432 | if (b->next_bio == NULL) return(0); | 446 | if (b->next_bio == NULL) |
| 433 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 447 | return (0); |
| 448 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); | ||
| 434 | break; | 449 | break; |
| 435 | } | ||
| 436 | return(ret); | ||
| 437 | malloc_error: | ||
| 438 | BIOerr(BIO_F_BUFFER_CTRL,ERR_R_MALLOC_FAILURE); | ||
| 439 | return(0); | ||
| 440 | } | 450 | } |
| 441 | 451 | return (ret); | |
| 442 | static long buffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) | 452 | malloc_error: |
| 443 | { | 453 | BIOerr(BIO_F_BUFFER_CTRL, ERR_R_MALLOC_FAILURE); |
| 444 | long ret=1; | 454 | return (0); |
| 445 | 455 | } | |
| 446 | if (b->next_bio == NULL) return(0); | 456 | |
| 447 | switch (cmd) | 457 | static long |
| 448 | { | 458 | buffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 459 | { | ||
| 460 | long ret = 1; | ||
| 461 | |||
| 462 | if (b->next_bio == NULL) | ||
| 463 | return (0); | ||
| 464 | switch (cmd) { | ||
| 449 | default: | 465 | default: |
| 450 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | 466 | ret = BIO_callback_ctrl(b->next_bio, cmd, fp); |
| 451 | break; | 467 | break; |
| 452 | } | ||
| 453 | return(ret); | ||
| 454 | } | 468 | } |
| 469 | return (ret); | ||
| 470 | } | ||
| 455 | 471 | ||
| 456 | static int buffer_gets(BIO *b, char *buf, int size) | 472 | static int |
| 457 | { | 473 | buffer_gets(BIO *b, char *buf, int size) |
| 474 | { | ||
| 458 | BIO_F_BUFFER_CTX *ctx; | 475 | BIO_F_BUFFER_CTX *ctx; |
| 459 | int num=0,i,flag; | 476 | int num = 0, i, flag; |
| 460 | char *p; | 477 | char *p; |
| 461 | 478 | ||
| 462 | ctx=(BIO_F_BUFFER_CTX *)b->ptr; | 479 | ctx = (BIO_F_BUFFER_CTX *)b->ptr; |
| 463 | size--; /* reserve space for a '\0' */ | 480 | size--; /* reserve space for a '\0' */ |
| 464 | BIO_clear_retry_flags(b); | 481 | BIO_clear_retry_flags(b); |
| 465 | 482 | ||
| 466 | for (;;) | 483 | for (;;) { |
| 467 | { | 484 | if (ctx->ibuf_len > 0) { |
| 468 | if (ctx->ibuf_len > 0) | 485 | p = &(ctx->ibuf[ctx->ibuf_off]); |
| 469 | { | 486 | flag = 0; |
| 470 | p= &(ctx->ibuf[ctx->ibuf_off]); | 487 | for (i = 0; (i < ctx->ibuf_len) && (i < size); i++) { |
| 471 | flag=0; | 488 | *(buf++) = p[i]; |
| 472 | for (i=0; (i<ctx->ibuf_len) && (i<size); i++) | 489 | if (p[i] == '\n') { |
| 473 | { | 490 | flag = 1; |
| 474 | *(buf++)=p[i]; | ||
| 475 | if (p[i] == '\n') | ||
| 476 | { | ||
| 477 | flag=1; | ||
| 478 | i++; | 491 | i++; |
| 479 | break; | 492 | break; |
| 480 | } | ||
| 481 | } | ||
| 482 | num+=i; | ||
| 483 | size-=i; | ||
| 484 | ctx->ibuf_len-=i; | ||
| 485 | ctx->ibuf_off+=i; | ||
| 486 | if (flag || size == 0) | ||
| 487 | { | ||
| 488 | *buf='\0'; | ||
| 489 | return(num); | ||
| 490 | } | 493 | } |
| 491 | } | 494 | } |
| 495 | num += i; | ||
| 496 | size -= i; | ||
| 497 | ctx->ibuf_len -= i; | ||
| 498 | ctx->ibuf_off += i; | ||
| 499 | if (flag || size == 0) { | ||
| 500 | *buf = '\0'; | ||
| 501 | return (num); | ||
| 502 | } | ||
| 503 | } | ||
| 492 | else /* read another chunk */ | 504 | else /* read another chunk */ |
| 493 | { | 505 | { |
| 494 | i=BIO_read(b->next_bio,ctx->ibuf,ctx->ibuf_size); | 506 | i = BIO_read(b->next_bio, ctx->ibuf, ctx->ibuf_size); |
| 495 | if (i <= 0) | 507 | if (i <= 0) { |
| 496 | { | ||
| 497 | BIO_copy_next_retry(b); | 508 | BIO_copy_next_retry(b); |
| 498 | *buf='\0'; | 509 | *buf = '\0'; |
| 499 | if (i < 0) return((num > 0)?num:i); | 510 | if (i < 0) |
| 500 | if (i == 0) return(num); | 511 | return ((num > 0) ? num : i); |
| 501 | } | 512 | if (i == 0) |
| 502 | ctx->ibuf_len=i; | 513 | return (num); |
| 503 | ctx->ibuf_off=0; | ||
| 504 | } | 514 | } |
| 515 | ctx->ibuf_len = i; | ||
| 516 | ctx->ibuf_off = 0; | ||
| 505 | } | 517 | } |
| 506 | } | 518 | } |
| 519 | } | ||
| 507 | 520 | ||
| 508 | static int buffer_puts(BIO *b, const char *str) | 521 | static int |
| 509 | { | 522 | buffer_puts(BIO *b, const char *str) |
| 510 | return(buffer_write(b,str,strlen(str))); | 523 | { |
| 511 | } | 524 | return (buffer_write(b, str, strlen(str))); |
| 512 | 525 | } | |
diff --git a/src/lib/libssl/src/crypto/bio/bf_lbuf.c b/src/lib/libssl/src/crypto/bio/bf_lbuf.c index ec0f7eb0b7..838839f1bf 100644 --- a/src/lib/libssl/src/crypto/bio/bf_lbuf.c +++ b/src/lib/libssl/src/crypto/bio/bf_lbuf.c | |||
| @@ -62,7 +62,7 @@ | |||
| 62 | #include <openssl/bio.h> | 62 | #include <openssl/bio.h> |
| 63 | #include <openssl/evp.h> | 63 | #include <openssl/evp.h> |
| 64 | 64 | ||
| 65 | static int linebuffer_write(BIO *h, const char *buf,int num); | 65 | static int linebuffer_write(BIO *h, const char *buf, int num); |
| 66 | static int linebuffer_read(BIO *h, char *buf, int size); | 66 | static int linebuffer_read(BIO *h, char *buf, int size); |
| 67 | static int linebuffer_puts(BIO *h, const char *str); | 67 | static int linebuffer_puts(BIO *h, const char *str); |
| 68 | static int linebuffer_gets(BIO *h, char *str, int size); | 68 | static int linebuffer_gets(BIO *h, char *str, int size); |
| @@ -76,8 +76,7 @@ static long linebuffer_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); | |||
| 76 | 76 | ||
| 77 | /* #define DEBUG */ | 77 | /* #define DEBUG */ |
| 78 | 78 | ||
| 79 | static BIO_METHOD methods_linebuffer= | 79 | static BIO_METHOD methods_linebuffer = { |
| 80 | { | ||
| 81 | BIO_TYPE_LINEBUFFER, | 80 | BIO_TYPE_LINEBUFFER, |
| 82 | "linebuffer", | 81 | "linebuffer", |
| 83 | linebuffer_write, | 82 | linebuffer_write, |
| @@ -88,310 +87,313 @@ static BIO_METHOD methods_linebuffer= | |||
| 88 | linebuffer_new, | 87 | linebuffer_new, |
| 89 | linebuffer_free, | 88 | linebuffer_free, |
| 90 | linebuffer_callback_ctrl, | 89 | linebuffer_callback_ctrl, |
| 91 | }; | 90 | }; |
| 92 | 91 | ||
| 93 | BIO_METHOD *BIO_f_linebuffer(void) | 92 | BIO_METHOD |
| 94 | { | 93 | *BIO_f_linebuffer(void) |
| 95 | return(&methods_linebuffer); | 94 | { |
| 96 | } | 95 | return (&methods_linebuffer); |
| 96 | } | ||
| 97 | 97 | ||
| 98 | typedef struct bio_linebuffer_ctx_struct | 98 | typedef struct bio_linebuffer_ctx_struct { |
| 99 | { | ||
| 100 | char *obuf; /* the output char array */ | 99 | char *obuf; /* the output char array */ |
| 101 | int obuf_size; /* how big is the output buffer */ | 100 | int obuf_size; /* how big is the output buffer */ |
| 102 | int obuf_len; /* how many bytes are in it */ | 101 | int obuf_len; /* how many bytes are in it */ |
| 103 | } BIO_LINEBUFFER_CTX; | 102 | } BIO_LINEBUFFER_CTX; |
| 104 | 103 | ||
| 105 | static int linebuffer_new(BIO *bi) | 104 | static int |
| 106 | { | 105 | linebuffer_new(BIO *bi) |
| 106 | { | ||
| 107 | BIO_LINEBUFFER_CTX *ctx; | 107 | BIO_LINEBUFFER_CTX *ctx; |
| 108 | 108 | ||
| 109 | ctx=(BIO_LINEBUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_LINEBUFFER_CTX)); | 109 | ctx = (BIO_LINEBUFFER_CTX *)OPENSSL_malloc(sizeof(BIO_LINEBUFFER_CTX)); |
| 110 | if (ctx == NULL) return(0); | 110 | if (ctx == NULL) |
| 111 | ctx->obuf=(char *)OPENSSL_malloc(DEFAULT_LINEBUFFER_SIZE); | 111 | return (0); |
| 112 | if (ctx->obuf == NULL) { OPENSSL_free(ctx); return(0); } | 112 | ctx->obuf = (char *)OPENSSL_malloc(DEFAULT_LINEBUFFER_SIZE); |
| 113 | ctx->obuf_size=DEFAULT_LINEBUFFER_SIZE; | 113 | if (ctx->obuf == NULL) { |
| 114 | ctx->obuf_len=0; | 114 | OPENSSL_free(ctx); |
| 115 | 115 | return (0); | |
| 116 | bi->init=1; | ||
| 117 | bi->ptr=(char *)ctx; | ||
| 118 | bi->flags=0; | ||
| 119 | return(1); | ||
| 120 | } | 116 | } |
| 117 | ctx->obuf_size = DEFAULT_LINEBUFFER_SIZE; | ||
| 118 | ctx->obuf_len = 0; | ||
| 119 | |||
| 120 | bi->init = 1; | ||
| 121 | bi->ptr = (char *)ctx; | ||
| 122 | bi->flags = 0; | ||
| 123 | return (1); | ||
| 124 | } | ||
| 121 | 125 | ||
| 122 | static int linebuffer_free(BIO *a) | 126 | static int |
| 123 | { | 127 | linebuffer_free(BIO *a) |
| 128 | { | ||
| 124 | BIO_LINEBUFFER_CTX *b; | 129 | BIO_LINEBUFFER_CTX *b; |
| 125 | 130 | ||
| 126 | if (a == NULL) return(0); | 131 | if (a == NULL) |
| 127 | b=(BIO_LINEBUFFER_CTX *)a->ptr; | 132 | return (0); |
| 128 | if (b->obuf != NULL) OPENSSL_free(b->obuf); | 133 | b = (BIO_LINEBUFFER_CTX *)a->ptr; |
| 134 | if (b->obuf != NULL) | ||
| 135 | OPENSSL_free(b->obuf); | ||
| 129 | OPENSSL_free(a->ptr); | 136 | OPENSSL_free(a->ptr); |
| 130 | a->ptr=NULL; | 137 | a->ptr = NULL; |
| 131 | a->init=0; | 138 | a->init = 0; |
| 132 | a->flags=0; | 139 | a->flags = 0; |
| 133 | return(1); | 140 | return (1); |
| 134 | } | 141 | } |
| 135 | 142 | ||
| 136 | static int linebuffer_read(BIO *b, char *out, int outl) | 143 | static int |
| 137 | { | 144 | linebuffer_read(BIO *b, char *out, int outl) |
| 138 | int ret=0; | 145 | { |
| 139 | 146 | int ret = 0; | |
| 140 | if (out == NULL) return(0); | 147 | |
| 141 | if (b->next_bio == NULL) return(0); | 148 | if (out == NULL) |
| 142 | ret=BIO_read(b->next_bio,out,outl); | 149 | return (0); |
| 150 | if (b->next_bio == NULL) | ||
| 151 | return (0); | ||
| 152 | ret = BIO_read(b->next_bio, out, outl); | ||
| 143 | BIO_clear_retry_flags(b); | 153 | BIO_clear_retry_flags(b); |
| 144 | BIO_copy_next_retry(b); | 154 | BIO_copy_next_retry(b); |
| 145 | return(ret); | 155 | return (ret); |
| 146 | } | 156 | } |
| 147 | 157 | ||
| 148 | static int linebuffer_write(BIO *b, const char *in, int inl) | 158 | static int |
| 149 | { | 159 | linebuffer_write(BIO *b, const char *in, int inl) |
| 150 | int i,num=0,foundnl; | 160 | { |
| 161 | int i, num = 0, foundnl; | ||
| 151 | BIO_LINEBUFFER_CTX *ctx; | 162 | BIO_LINEBUFFER_CTX *ctx; |
| 152 | 163 | ||
| 153 | if ((in == NULL) || (inl <= 0)) return(0); | 164 | if ((in == NULL) || (inl <= 0)) |
| 154 | ctx=(BIO_LINEBUFFER_CTX *)b->ptr; | 165 | return (0); |
| 155 | if ((ctx == NULL) || (b->next_bio == NULL)) return(0); | 166 | ctx = (BIO_LINEBUFFER_CTX *)b->ptr; |
| 167 | if ((ctx == NULL) || (b->next_bio == NULL)) | ||
| 168 | return (0); | ||
| 156 | 169 | ||
| 157 | BIO_clear_retry_flags(b); | 170 | BIO_clear_retry_flags(b); |
| 158 | 171 | ||
| 159 | do | 172 | do { |
| 160 | { | ||
| 161 | const char *p; | 173 | const char *p; |
| 162 | 174 | ||
| 163 | for(p = in; p < in + inl && *p != '\n'; p++) | 175 | for (p = in; p < in + inl && *p != '\n'; p++) |
| 164 | ; | 176 | ; |
| 165 | if (*p == '\n') | 177 | if (*p == '\n') { |
| 166 | { | ||
| 167 | p++; | 178 | p++; |
| 168 | foundnl = 1; | 179 | foundnl = 1; |
| 169 | } | 180 | } else |
| 170 | else | ||
| 171 | foundnl = 0; | 181 | foundnl = 0; |
| 172 | 182 | ||
| 173 | /* If a NL was found and we already have text in the save | 183 | /* If a NL was found and we already have text in the save |
| 174 | buffer, concatenate them and write */ | 184 | buffer, concatenate them and write */ |
| 175 | while ((foundnl || p - in > ctx->obuf_size - ctx->obuf_len) | 185 | while ((foundnl || p - in > ctx->obuf_size - ctx->obuf_len) && |
| 176 | && ctx->obuf_len > 0) | 186 | ctx->obuf_len > 0) { |
| 177 | { | ||
| 178 | int orig_olen = ctx->obuf_len; | 187 | int orig_olen = ctx->obuf_len; |
| 179 | 188 | ||
| 180 | i = ctx->obuf_size - ctx->obuf_len; | 189 | i = ctx->obuf_size - ctx->obuf_len; |
| 181 | if (p - in > 0) | 190 | if (p - in > 0) { |
| 182 | { | 191 | if (i >= p - in) { |
| 183 | if (i >= p - in) | ||
| 184 | { | ||
| 185 | memcpy(&(ctx->obuf[ctx->obuf_len]), | 192 | memcpy(&(ctx->obuf[ctx->obuf_len]), |
| 186 | in,p - in); | 193 | in, p - in); |
| 187 | ctx->obuf_len += p - in; | 194 | ctx->obuf_len += p - in; |
| 188 | inl -= p - in; | 195 | inl -= p - in; |
| 189 | num += p - in; | 196 | num += p - in; |
| 190 | in = p; | 197 | in = p; |
| 191 | } | 198 | } else { |
| 192 | else | ||
| 193 | { | ||
| 194 | memcpy(&(ctx->obuf[ctx->obuf_len]), | 199 | memcpy(&(ctx->obuf[ctx->obuf_len]), |
| 195 | in,i); | 200 | in, i); |
| 196 | ctx->obuf_len += i; | 201 | ctx->obuf_len += i; |
| 197 | inl -= i; | 202 | inl -= i; |
| 198 | in += i; | 203 | in += i; |
| 199 | num += i; | 204 | num += i; |
| 200 | } | ||
| 201 | } | 205 | } |
| 206 | } | ||
| 202 | 207 | ||
| 203 | #if 0 | 208 | #if 0 |
| 204 | BIO_write(b->next_bio, "<*<", 3); | 209 | BIO_write(b->next_bio, "<*<", 3); |
| 205 | #endif | 210 | #endif |
| 206 | i=BIO_write(b->next_bio, | 211 | i = BIO_write(b->next_bio, ctx->obuf, ctx->obuf_len); |
| 207 | ctx->obuf, ctx->obuf_len); | 212 | if (i <= 0) { |
| 208 | if (i <= 0) | ||
| 209 | { | ||
| 210 | ctx->obuf_len = orig_olen; | 213 | ctx->obuf_len = orig_olen; |
| 211 | BIO_copy_next_retry(b); | 214 | BIO_copy_next_retry(b); |
| 212 | |||
| 213 | #if 0 | 215 | #if 0 |
| 214 | BIO_write(b->next_bio, ">*>", 3); | 216 | BIO_write(b->next_bio, ">*>", 3); |
| 215 | #endif | 217 | #endif |
| 216 | if (i < 0) return((num > 0)?num:i); | 218 | if (i < 0) |
| 217 | if (i == 0) return(num); | 219 | return ((num > 0) ? num : i); |
| 218 | } | 220 | if (i == 0) |
| 221 | return (num); | ||
| 222 | } | ||
| 219 | #if 0 | 223 | #if 0 |
| 220 | BIO_write(b->next_bio, ">*>", 3); | 224 | BIO_write(b->next_bio, ">*>", 3); |
| 221 | #endif | 225 | #endif |
| 222 | if (i < ctx->obuf_len) | 226 | if (i < ctx->obuf_len) |
| 223 | memmove(ctx->obuf, ctx->obuf + i, | 227 | memmove(ctx->obuf, ctx->obuf + i, |
| 224 | ctx->obuf_len - i); | 228 | ctx->obuf_len - i); |
| 225 | ctx->obuf_len-=i; | 229 | ctx->obuf_len -= i; |
| 226 | } | 230 | } |
| 227 | 231 | ||
| 228 | /* Now that the save buffer is emptied, let's write the input | 232 | /* Now that the save buffer is emptied, let's write the input |
| 229 | buffer if a NL was found and there is anything to write. */ | 233 | buffer if a NL was found and there is anything to write. */ |
| 230 | if ((foundnl || p - in > ctx->obuf_size) && p - in > 0) | 234 | if ((foundnl || p - in > ctx->obuf_size) && p - in > 0) { |
| 231 | { | ||
| 232 | #if 0 | 235 | #if 0 |
| 233 | BIO_write(b->next_bio, "<*<", 3); | 236 | BIO_write(b->next_bio, "<*<", 3); |
| 234 | #endif | 237 | #endif |
| 235 | i=BIO_write(b->next_bio,in,p - in); | 238 | i = BIO_write(b->next_bio, in, p - in); |
| 236 | if (i <= 0) | 239 | if (i <= 0) { |
| 237 | { | ||
| 238 | BIO_copy_next_retry(b); | 240 | BIO_copy_next_retry(b); |
| 239 | #if 0 | 241 | #if 0 |
| 240 | BIO_write(b->next_bio, ">*>", 3); | 242 | BIO_write(b->next_bio, ">*>", 3); |
| 241 | #endif | 243 | #endif |
| 242 | if (i < 0) return((num > 0)?num:i); | 244 | if (i < 0) |
| 243 | if (i == 0) return(num); | 245 | return ((num > 0) ? num : i); |
| 244 | } | 246 | if (i == 0) |
| 247 | return (num); | ||
| 248 | } | ||
| 245 | #if 0 | 249 | #if 0 |
| 246 | BIO_write(b->next_bio, ">*>", 3); | 250 | BIO_write(b->next_bio, ">*>", 3); |
| 247 | #endif | 251 | #endif |
| 248 | num+=i; | 252 | num += i; |
| 249 | in+=i; | 253 | in += i; |
| 250 | inl-=i; | 254 | inl -= i; |
| 251 | } | ||
| 252 | } | 255 | } |
| 253 | while(foundnl && inl > 0); | 256 | } while (foundnl && inl > 0); |
| 254 | /* We've written as much as we can. The rest of the input buffer, if | 257 | /* We've written as much as we can. The rest of the input buffer, if |
| 255 | any, is text that doesn't and with a NL and therefore needs to be | 258 | any, is text that doesn't and with a NL and therefore needs to be |
| 256 | saved for the next trip. */ | 259 | saved for the next trip. */ |
| 257 | if (inl > 0) | 260 | if (inl > 0) { |
| 258 | { | ||
| 259 | memcpy(&(ctx->obuf[ctx->obuf_len]), in, inl); | 261 | memcpy(&(ctx->obuf[ctx->obuf_len]), in, inl); |
| 260 | ctx->obuf_len += inl; | 262 | ctx->obuf_len += inl; |
| 261 | num += inl; | 263 | num += inl; |
| 262 | } | ||
| 263 | return num; | ||
| 264 | } | 264 | } |
| 265 | return num; | ||
| 266 | } | ||
| 265 | 267 | ||
| 266 | static long linebuffer_ctrl(BIO *b, int cmd, long num, void *ptr) | 268 | static long |
| 267 | { | 269 | linebuffer_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 270 | { | ||
| 268 | BIO *dbio; | 271 | BIO *dbio; |
| 269 | BIO_LINEBUFFER_CTX *ctx; | 272 | BIO_LINEBUFFER_CTX *ctx; |
| 270 | long ret=1; | 273 | long ret = 1; |
| 271 | char *p; | 274 | char *p; |
| 272 | int r; | 275 | int r; |
| 273 | int obs; | 276 | int obs; |
| 274 | 277 | ||
| 275 | ctx=(BIO_LINEBUFFER_CTX *)b->ptr; | 278 | ctx = (BIO_LINEBUFFER_CTX *)b->ptr; |
| 276 | 279 | ||
| 277 | switch (cmd) | 280 | switch (cmd) { |
| 278 | { | ||
| 279 | case BIO_CTRL_RESET: | 281 | case BIO_CTRL_RESET: |
| 280 | ctx->obuf_len=0; | 282 | ctx->obuf_len = 0; |
| 281 | if (b->next_bio == NULL) return(0); | 283 | if (b->next_bio == NULL) |
| 282 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 284 | return (0); |
| 285 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); | ||
| 283 | break; | 286 | break; |
| 284 | case BIO_CTRL_INFO: | 287 | case BIO_CTRL_INFO: |
| 285 | ret=(long)ctx->obuf_len; | 288 | ret = (long)ctx->obuf_len; |
| 286 | break; | 289 | break; |
| 287 | case BIO_CTRL_WPENDING: | 290 | case BIO_CTRL_WPENDING: |
| 288 | ret=(long)ctx->obuf_len; | 291 | ret = (long)ctx->obuf_len; |
| 289 | if (ret == 0) | 292 | if (ret == 0) { |
| 290 | { | 293 | if (b->next_bio == NULL) |
| 291 | if (b->next_bio == NULL) return(0); | 294 | return (0); |
| 292 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 295 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 293 | } | 296 | } |
| 294 | break; | 297 | break; |
| 295 | case BIO_C_SET_BUFF_SIZE: | 298 | case BIO_C_SET_BUFF_SIZE: |
| 296 | obs=(int)num; | 299 | obs = (int)num; |
| 297 | p=ctx->obuf; | 300 | p = ctx->obuf; |
| 298 | if ((obs > DEFAULT_LINEBUFFER_SIZE) && (obs != ctx->obuf_size)) | 301 | if ((obs > DEFAULT_LINEBUFFER_SIZE) && (obs != ctx->obuf_size)) { |
| 299 | { | 302 | p = (char *)OPENSSL_malloc((int)num); |
| 300 | p=(char *)OPENSSL_malloc((int)num); | ||
| 301 | if (p == NULL) | 303 | if (p == NULL) |
| 302 | goto malloc_error; | 304 | goto malloc_error; |
| 303 | } | 305 | } |
| 304 | if (ctx->obuf != p) | 306 | if (ctx->obuf != p) { |
| 305 | { | 307 | if (ctx->obuf_len > obs) { |
| 306 | if (ctx->obuf_len > obs) | ||
| 307 | { | ||
| 308 | ctx->obuf_len = obs; | 308 | ctx->obuf_len = obs; |
| 309 | } | 309 | } |
| 310 | memcpy(p, ctx->obuf, ctx->obuf_len); | 310 | memcpy(p, ctx->obuf, ctx->obuf_len); |
| 311 | OPENSSL_free(ctx->obuf); | 311 | OPENSSL_free(ctx->obuf); |
| 312 | ctx->obuf=p; | 312 | ctx->obuf = p; |
| 313 | ctx->obuf_size=obs; | 313 | ctx->obuf_size = obs; |
| 314 | } | 314 | } |
| 315 | break; | 315 | break; |
| 316 | case BIO_C_DO_STATE_MACHINE: | 316 | case BIO_C_DO_STATE_MACHINE: |
| 317 | if (b->next_bio == NULL) return(0); | 317 | if (b->next_bio == NULL) |
| 318 | return (0); | ||
| 318 | BIO_clear_retry_flags(b); | 319 | BIO_clear_retry_flags(b); |
| 319 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 320 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 320 | BIO_copy_next_retry(b); | 321 | BIO_copy_next_retry(b); |
| 321 | break; | 322 | break; |
| 322 | 323 | ||
| 323 | case BIO_CTRL_FLUSH: | 324 | case BIO_CTRL_FLUSH: |
| 324 | if (b->next_bio == NULL) return(0); | 325 | if (b->next_bio == NULL) |
| 325 | if (ctx->obuf_len <= 0) | 326 | return (0); |
| 326 | { | 327 | if (ctx->obuf_len <= 0) { |
| 327 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 328 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 328 | break; | 329 | break; |
| 329 | } | 330 | } |
| 330 | 331 | ||
| 331 | for (;;) | 332 | for (;;) { |
| 332 | { | ||
| 333 | BIO_clear_retry_flags(b); | 333 | BIO_clear_retry_flags(b); |
| 334 | if (ctx->obuf_len > 0) | 334 | if (ctx->obuf_len > 0) { |
| 335 | { | 335 | r = BIO_write(b->next_bio, |
| 336 | r=BIO_write(b->next_bio, | 336 | ctx->obuf, ctx->obuf_len); |
| 337 | ctx->obuf, ctx->obuf_len); | ||
| 338 | #if 0 | 337 | #if 0 |
| 339 | fprintf(stderr,"FLUSH %3d -> %3d\n",ctx->obuf_len,r); | 338 | fprintf(stderr, "FLUSH %3d -> %3d\n", ctx->obuf_len, r); |
| 340 | #endif | 339 | #endif |
| 341 | BIO_copy_next_retry(b); | 340 | BIO_copy_next_retry(b); |
| 342 | if (r <= 0) return((long)r); | 341 | if (r <= 0) |
| 342 | return ((long)r); | ||
| 343 | if (r < ctx->obuf_len) | 343 | if (r < ctx->obuf_len) |
| 344 | memmove(ctx->obuf, ctx->obuf + r, | 344 | memmove(ctx->obuf, ctx->obuf + r, |
| 345 | ctx->obuf_len - r); | 345 | ctx->obuf_len - r); |
| 346 | ctx->obuf_len-=r; | 346 | ctx->obuf_len -= r; |
| 347 | } | 347 | } else { |
| 348 | else | 348 | ctx->obuf_len = 0; |
| 349 | { | 349 | ret = 1; |
| 350 | ctx->obuf_len=0; | ||
| 351 | ret=1; | ||
| 352 | break; | 350 | break; |
| 353 | } | ||
| 354 | } | 351 | } |
| 355 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 352 | } |
| 353 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); | ||
| 356 | break; | 354 | break; |
| 357 | case BIO_CTRL_DUP: | 355 | case BIO_CTRL_DUP: |
| 358 | dbio=(BIO *)ptr; | 356 | dbio = (BIO *)ptr; |
| 359 | if ( !BIO_set_write_buffer_size(dbio,ctx->obuf_size)) | 357 | if (!BIO_set_write_buffer_size(dbio, ctx->obuf_size)) |
| 360 | ret=0; | 358 | ret = 0; |
| 361 | break; | 359 | break; |
| 362 | default: | 360 | default: |
| 363 | if (b->next_bio == NULL) return(0); | 361 | if (b->next_bio == NULL) |
| 364 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 362 | return (0); |
| 363 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); | ||
| 365 | break; | 364 | break; |
| 366 | } | ||
| 367 | return(ret); | ||
| 368 | malloc_error: | ||
| 369 | BIOerr(BIO_F_LINEBUFFER_CTRL,ERR_R_MALLOC_FAILURE); | ||
| 370 | return(0); | ||
| 371 | } | 365 | } |
| 366 | return (ret); | ||
| 367 | malloc_error: | ||
| 368 | BIOerr(BIO_F_LINEBUFFER_CTRL, ERR_R_MALLOC_FAILURE); | ||
| 369 | return (0); | ||
| 370 | } | ||
| 372 | 371 | ||
| 373 | static long linebuffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) | 372 | static long |
| 374 | { | 373 | linebuffer_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 375 | long ret=1; | 374 | { |
| 375 | long ret = 1; | ||
| 376 | 376 | ||
| 377 | if (b->next_bio == NULL) return(0); | 377 | if (b->next_bio == NULL) |
| 378 | switch (cmd) | 378 | return (0); |
| 379 | { | 379 | switch (cmd) { |
| 380 | default: | 380 | default: |
| 381 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | 381 | ret = BIO_callback_ctrl(b->next_bio, cmd, fp); |
| 382 | break; | 382 | break; |
| 383 | } | ||
| 384 | return(ret); | ||
| 385 | } | 383 | } |
| 384 | return (ret); | ||
| 385 | } | ||
| 386 | 386 | ||
| 387 | static int linebuffer_gets(BIO *b, char *buf, int size) | 387 | static int |
| 388 | { | 388 | linebuffer_gets(BIO *b, char *buf, int size) |
| 389 | if (b->next_bio == NULL) return(0); | 389 | { |
| 390 | return(BIO_gets(b->next_bio,buf,size)); | 390 | if (b->next_bio == NULL) |
| 391 | } | 391 | return (0); |
| 392 | 392 | return (BIO_gets(b->next_bio, buf, size)); | |
| 393 | static int linebuffer_puts(BIO *b, const char *str) | 393 | } |
| 394 | { | ||
| 395 | return(linebuffer_write(b,str,strlen(str))); | ||
| 396 | } | ||
| 397 | 394 | ||
| 395 | static int | ||
| 396 | linebuffer_puts(BIO *b, const char *str) | ||
| 397 | { | ||
| 398 | return (linebuffer_write(b, str, strlen(str))); | ||
| 399 | } | ||
diff --git a/src/lib/libssl/src/crypto/bio/bf_nbio.c b/src/lib/libssl/src/crypto/bio/bf_nbio.c index 028616c064..76f8f31950 100644 --- a/src/lib/libssl/src/crypto/bio/bf_nbio.c +++ b/src/lib/libssl/src/crypto/bio/bf_nbio.c | |||
| @@ -65,23 +65,22 @@ | |||
| 65 | /* BIO_put and BIO_get both add to the digest, | 65 | /* BIO_put and BIO_get both add to the digest, |
| 66 | * BIO_gets returns the digest */ | 66 | * BIO_gets returns the digest */ |
| 67 | 67 | ||
| 68 | static int nbiof_write(BIO *h,const char *buf,int num); | 68 | static int nbiof_write(BIO *h, const char *buf, int num); |
| 69 | static int nbiof_read(BIO *h,char *buf,int size); | 69 | static int nbiof_read(BIO *h, char *buf, int size); |
| 70 | static int nbiof_puts(BIO *h,const char *str); | 70 | static int nbiof_puts(BIO *h, const char *str); |
| 71 | static int nbiof_gets(BIO *h,char *str,int size); | 71 | static int nbiof_gets(BIO *h, char *str, int size); |
| 72 | static long nbiof_ctrl(BIO *h,int cmd,long arg1,void *arg2); | 72 | static long nbiof_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 73 | static int nbiof_new(BIO *h); | 73 | static int nbiof_new(BIO *h); |
| 74 | static int nbiof_free(BIO *data); | 74 | static int nbiof_free(BIO *data); |
| 75 | static long nbiof_callback_ctrl(BIO *h,int cmd,bio_info_cb *fp); | 75 | static long nbiof_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); |
| 76 | typedef struct nbio_test_st | 76 | |
| 77 | { | 77 | typedef struct nbio_test_st { |
| 78 | /* only set if we sent a 'should retry' error */ | 78 | /* only set if we sent a 'should retry' error */ |
| 79 | int lrn; | 79 | int lrn; |
| 80 | int lwn; | 80 | int lwn; |
| 81 | } NBIO_TEST; | 81 | } NBIO_TEST; |
| 82 | 82 | ||
| 83 | static BIO_METHOD methods_nbiof= | 83 | static BIO_METHOD methods_nbiof = { |
| 84 | { | ||
| 85 | BIO_TYPE_NBIO_TEST, | 84 | BIO_TYPE_NBIO_TEST, |
| 86 | "non-blocking IO test filter", | 85 | "non-blocking IO test filter", |
| 87 | nbiof_write, | 86 | nbiof_write, |
| @@ -92,162 +91,170 @@ static BIO_METHOD methods_nbiof= | |||
| 92 | nbiof_new, | 91 | nbiof_new, |
| 93 | nbiof_free, | 92 | nbiof_free, |
| 94 | nbiof_callback_ctrl, | 93 | nbiof_callback_ctrl, |
| 95 | }; | 94 | }; |
| 96 | 95 | ||
| 97 | BIO_METHOD *BIO_f_nbio_test(void) | 96 | BIO_METHOD |
| 98 | { | 97 | *BIO_f_nbio_test(void) |
| 99 | return(&methods_nbiof); | 98 | { |
| 100 | } | 99 | return (&methods_nbiof); |
| 100 | } | ||
| 101 | 101 | ||
| 102 | static int nbiof_new(BIO *bi) | 102 | static int |
| 103 | { | 103 | nbiof_new(BIO *bi) |
| 104 | { | ||
| 104 | NBIO_TEST *nt; | 105 | NBIO_TEST *nt; |
| 105 | 106 | ||
| 106 | if (!(nt=(NBIO_TEST *)OPENSSL_malloc(sizeof(NBIO_TEST)))) return(0); | 107 | if (!(nt = (NBIO_TEST *)OPENSSL_malloc(sizeof(NBIO_TEST)))) |
| 107 | nt->lrn= -1; | 108 | return (0); |
| 108 | nt->lwn= -1; | 109 | nt->lrn = -1; |
| 109 | bi->ptr=(char *)nt; | 110 | nt->lwn = -1; |
| 110 | bi->init=1; | 111 | bi->ptr = (char *)nt; |
| 111 | bi->flags=0; | 112 | bi->init = 1; |
| 112 | return(1); | 113 | bi->flags = 0; |
| 113 | } | 114 | return (1); |
| 115 | } | ||
| 114 | 116 | ||
| 115 | static int nbiof_free(BIO *a) | 117 | static int |
| 116 | { | 118 | nbiof_free(BIO *a) |
| 117 | if (a == NULL) return(0); | 119 | { |
| 120 | if (a == NULL) | ||
| 121 | return (0); | ||
| 118 | if (a->ptr != NULL) | 122 | if (a->ptr != NULL) |
| 119 | OPENSSL_free(a->ptr); | 123 | OPENSSL_free(a->ptr); |
| 120 | a->ptr=NULL; | 124 | a->ptr = NULL; |
| 121 | a->init=0; | 125 | a->init = 0; |
| 122 | a->flags=0; | 126 | a->flags = 0; |
| 123 | return(1); | 127 | return (1); |
| 124 | } | 128 | } |
| 125 | 129 | ||
| 126 | static int nbiof_read(BIO *b, char *out, int outl) | 130 | static int |
| 127 | { | 131 | nbiof_read(BIO *b, char *out, int outl) |
| 128 | int ret=0; | 132 | { |
| 133 | int ret = 0; | ||
| 129 | #if 1 | 134 | #if 1 |
| 130 | int num; | 135 | int num; |
| 131 | unsigned char n; | 136 | unsigned char n; |
| 132 | #endif | 137 | #endif |
| 133 | 138 | ||
| 134 | if (out == NULL) return(0); | 139 | if (out == NULL) |
| 135 | if (b->next_bio == NULL) return(0); | 140 | return (0); |
| 141 | if (b->next_bio == NULL) | ||
| 142 | return (0); | ||
| 136 | 143 | ||
| 137 | BIO_clear_retry_flags(b); | 144 | BIO_clear_retry_flags(b); |
| 138 | #if 1 | 145 | #if 1 |
| 139 | RAND_pseudo_bytes(&n,1); | 146 | RAND_pseudo_bytes(&n, 1); |
| 140 | num=(n&0x07); | 147 | num = (n & 0x07); |
| 141 | 148 | ||
| 142 | if (outl > num) outl=num; | 149 | if (outl > num) |
| 150 | outl = num; | ||
| 143 | 151 | ||
| 144 | if (num == 0) | 152 | if (num == 0) { |
| 145 | { | 153 | ret = -1; |
| 146 | ret= -1; | ||
| 147 | BIO_set_retry_read(b); | 154 | BIO_set_retry_read(b); |
| 148 | } | 155 | } else |
| 149 | else | ||
| 150 | #endif | 156 | #endif |
| 151 | { | 157 | { |
| 152 | ret=BIO_read(b->next_bio,out,outl); | 158 | ret = BIO_read(b->next_bio, out, outl); |
| 153 | if (ret < 0) | 159 | if (ret < 0) |
| 154 | BIO_copy_next_retry(b); | 160 | BIO_copy_next_retry(b); |
| 155 | } | ||
| 156 | return(ret); | ||
| 157 | } | 161 | } |
| 162 | return (ret); | ||
| 163 | } | ||
| 158 | 164 | ||
| 159 | static int nbiof_write(BIO *b, const char *in, int inl) | 165 | static int |
| 160 | { | 166 | nbiof_write(BIO *b, const char *in, int inl) |
| 167 | { | ||
| 161 | NBIO_TEST *nt; | 168 | NBIO_TEST *nt; |
| 162 | int ret=0; | 169 | int ret = 0; |
| 163 | int num; | 170 | int num; |
| 164 | unsigned char n; | 171 | unsigned char n; |
| 165 | 172 | ||
| 166 | if ((in == NULL) || (inl <= 0)) return(0); | 173 | if ((in == NULL) || (inl <= 0)) |
| 167 | if (b->next_bio == NULL) return(0); | 174 | return (0); |
| 168 | nt=(NBIO_TEST *)b->ptr; | 175 | if (b->next_bio == NULL) |
| 176 | return (0); | ||
| 177 | nt = (NBIO_TEST *)b->ptr; | ||
| 169 | 178 | ||
| 170 | BIO_clear_retry_flags(b); | 179 | BIO_clear_retry_flags(b); |
| 171 | 180 | ||
| 172 | #if 1 | 181 | #if 1 |
| 173 | if (nt->lwn > 0) | 182 | if (nt->lwn > 0) { |
| 174 | { | 183 | num = nt->lwn; |
| 175 | num=nt->lwn; | 184 | nt->lwn = 0; |
| 176 | nt->lwn=0; | 185 | } else { |
| 177 | } | 186 | RAND_pseudo_bytes(&n, 1); |
| 178 | else | 187 | num = (n&7); |
| 179 | { | 188 | } |
| 180 | RAND_pseudo_bytes(&n,1); | ||
| 181 | num=(n&7); | ||
| 182 | } | ||
| 183 | 189 | ||
| 184 | if (inl > num) inl=num; | 190 | if (inl > num) |
| 191 | inl = num; | ||
| 185 | 192 | ||
| 186 | if (num == 0) | 193 | if (num == 0) { |
| 187 | { | 194 | ret = -1; |
| 188 | ret= -1; | ||
| 189 | BIO_set_retry_write(b); | 195 | BIO_set_retry_write(b); |
| 190 | } | 196 | } else |
| 191 | else | ||
| 192 | #endif | 197 | #endif |
| 193 | { | 198 | { |
| 194 | ret=BIO_write(b->next_bio,in,inl); | 199 | ret = BIO_write(b->next_bio, in, inl); |
| 195 | if (ret < 0) | 200 | if (ret < 0) { |
| 196 | { | ||
| 197 | BIO_copy_next_retry(b); | 201 | BIO_copy_next_retry(b); |
| 198 | nt->lwn=inl; | 202 | nt->lwn = inl; |
| 199 | } | ||
| 200 | } | 203 | } |
| 201 | return(ret); | ||
| 202 | } | 204 | } |
| 205 | return (ret); | ||
| 206 | } | ||
| 203 | 207 | ||
| 204 | static long nbiof_ctrl(BIO *b, int cmd, long num, void *ptr) | 208 | static long |
| 205 | { | 209 | nbiof_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 210 | { | ||
| 206 | long ret; | 211 | long ret; |
| 207 | 212 | ||
| 208 | if (b->next_bio == NULL) return(0); | 213 | if (b->next_bio == NULL) |
| 209 | switch (cmd) | 214 | return (0); |
| 210 | { | 215 | switch (cmd) { |
| 211 | case BIO_C_DO_STATE_MACHINE: | 216 | case BIO_C_DO_STATE_MACHINE: |
| 212 | BIO_clear_retry_flags(b); | 217 | BIO_clear_retry_flags(b); |
| 213 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 218 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 214 | BIO_copy_next_retry(b); | 219 | BIO_copy_next_retry(b); |
| 215 | break; | 220 | break; |
| 216 | case BIO_CTRL_DUP: | 221 | case BIO_CTRL_DUP: |
| 217 | ret=0L; | 222 | ret = 0L; |
| 218 | break; | 223 | break; |
| 219 | default: | 224 | default: |
| 220 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 225 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 221 | break; | 226 | break; |
| 222 | } | ||
| 223 | return(ret); | ||
| 224 | } | 227 | } |
| 228 | return (ret); | ||
| 229 | } | ||
| 225 | 230 | ||
| 226 | static long nbiof_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) | 231 | static long |
| 227 | { | 232 | nbiof_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 228 | long ret=1; | 233 | { |
| 234 | long ret = 1; | ||
| 229 | 235 | ||
| 230 | if (b->next_bio == NULL) return(0); | 236 | if (b->next_bio == NULL) |
| 231 | switch (cmd) | 237 | return (0); |
| 232 | { | 238 | switch (cmd) { |
| 233 | default: | 239 | default: |
| 234 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | 240 | ret = BIO_callback_ctrl(b->next_bio, cmd, fp); |
| 235 | break; | 241 | break; |
| 236 | } | ||
| 237 | return(ret); | ||
| 238 | } | ||
| 239 | |||
| 240 | static int nbiof_gets(BIO *bp, char *buf, int size) | ||
| 241 | { | ||
| 242 | if (bp->next_bio == NULL) return(0); | ||
| 243 | return(BIO_gets(bp->next_bio,buf,size)); | ||
| 244 | } | ||
| 245 | |||
| 246 | |||
| 247 | static int nbiof_puts(BIO *bp, const char *str) | ||
| 248 | { | ||
| 249 | if (bp->next_bio == NULL) return(0); | ||
| 250 | return(BIO_puts(bp->next_bio,str)); | ||
| 251 | } | 242 | } |
| 243 | return (ret); | ||
| 244 | } | ||
| 252 | 245 | ||
| 246 | static int | ||
| 247 | nbiof_gets(BIO *bp, char *buf, int size) | ||
| 248 | { | ||
| 249 | if (bp->next_bio == NULL) | ||
| 250 | return (0); | ||
| 251 | return (BIO_gets(bp->next_bio, buf, size)); | ||
| 252 | } | ||
| 253 | 253 | ||
| 254 | static int | ||
| 255 | nbiof_puts(BIO *bp, const char *str) | ||
| 256 | { | ||
| 257 | if (bp->next_bio == NULL) | ||
| 258 | return (0); | ||
| 259 | return (BIO_puts(bp->next_bio, str)); | ||
| 260 | } | ||
diff --git a/src/lib/libssl/src/crypto/bio/bf_null.c b/src/lib/libssl/src/crypto/bio/bf_null.c index c1bf39a904..354731c0c7 100644 --- a/src/lib/libssl/src/crypto/bio/bf_null.c +++ b/src/lib/libssl/src/crypto/bio/bf_null.c | |||
| @@ -72,8 +72,8 @@ static long nullf_ctrl(BIO *h, int cmd, long arg1, void *arg2); | |||
| 72 | static int nullf_new(BIO *h); | 72 | static int nullf_new(BIO *h); |
| 73 | static int nullf_free(BIO *data); | 73 | static int nullf_free(BIO *data); |
| 74 | static long nullf_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); | 74 | static long nullf_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); |
| 75 | static BIO_METHOD methods_nullf= | 75 | |
| 76 | { | 76 | static BIO_METHOD methods_nullf = { |
| 77 | BIO_TYPE_NULL_FILTER, | 77 | BIO_TYPE_NULL_FILTER, |
| 78 | "NULL filter", | 78 | "NULL filter", |
| 79 | nullf_write, | 79 | nullf_write, |
| @@ -84,100 +84,113 @@ static BIO_METHOD methods_nullf= | |||
| 84 | nullf_new, | 84 | nullf_new, |
| 85 | nullf_free, | 85 | nullf_free, |
| 86 | nullf_callback_ctrl, | 86 | nullf_callback_ctrl, |
| 87 | }; | 87 | }; |
| 88 | 88 | ||
| 89 | BIO_METHOD *BIO_f_null(void) | 89 | BIO_METHOD |
| 90 | { | 90 | *BIO_f_null(void) |
| 91 | return(&methods_nullf); | 91 | { |
| 92 | } | 92 | return (&methods_nullf); |
| 93 | 93 | } | |
| 94 | static int nullf_new(BIO *bi) | 94 | |
| 95 | { | 95 | static int |
| 96 | bi->init=1; | 96 | nullf_new(BIO *bi) |
| 97 | bi->ptr=NULL; | 97 | { |
| 98 | bi->flags=0; | 98 | bi->init = 1; |
| 99 | return(1); | 99 | bi->ptr = NULL; |
| 100 | } | 100 | bi->flags = 0; |
| 101 | 101 | return (1); | |
| 102 | static int nullf_free(BIO *a) | 102 | } |
| 103 | { | 103 | |
| 104 | if (a == NULL) return(0); | 104 | static int |
| 105 | nullf_free(BIO *a) | ||
| 106 | { | ||
| 107 | if (a == NULL) | ||
| 108 | return (0); | ||
| 105 | /* a->ptr=NULL; | 109 | /* a->ptr=NULL; |
| 106 | a->init=0; | 110 | a->init=0; |
| 107 | a->flags=0;*/ | 111 | a->flags=0;*/ |
| 108 | return(1); | 112 | return (1); |
| 109 | } | 113 | } |
| 110 | 114 | ||
| 111 | static int nullf_read(BIO *b, char *out, int outl) | 115 | static int |
| 112 | { | 116 | nullf_read(BIO *b, char *out, int outl) |
| 113 | int ret=0; | 117 | { |
| 114 | 118 | int ret = 0; | |
| 115 | if (out == NULL) return(0); | 119 | |
| 116 | if (b->next_bio == NULL) return(0); | 120 | if (out == NULL) |
| 117 | ret=BIO_read(b->next_bio,out,outl); | 121 | return (0); |
| 122 | if (b->next_bio == NULL) | ||
| 123 | return (0); | ||
| 124 | ret = BIO_read(b->next_bio, out, outl); | ||
| 118 | BIO_clear_retry_flags(b); | 125 | BIO_clear_retry_flags(b); |
| 119 | BIO_copy_next_retry(b); | 126 | BIO_copy_next_retry(b); |
| 120 | return(ret); | 127 | return (ret); |
| 121 | } | 128 | } |
| 122 | 129 | ||
| 123 | static int nullf_write(BIO *b, const char *in, int inl) | 130 | static int |
| 124 | { | 131 | nullf_write(BIO *b, const char *in, int inl) |
| 125 | int ret=0; | 132 | { |
| 126 | 133 | int ret = 0; | |
| 127 | if ((in == NULL) || (inl <= 0)) return(0); | 134 | |
| 128 | if (b->next_bio == NULL) return(0); | 135 | if ((in == NULL) || (inl <= 0)) |
| 129 | ret=BIO_write(b->next_bio,in,inl); | 136 | return (0); |
| 137 | if (b->next_bio == NULL) | ||
| 138 | return (0); | ||
| 139 | ret = BIO_write(b->next_bio, in, inl); | ||
| 130 | BIO_clear_retry_flags(b); | 140 | BIO_clear_retry_flags(b); |
| 131 | BIO_copy_next_retry(b); | 141 | BIO_copy_next_retry(b); |
| 132 | return(ret); | 142 | return (ret); |
| 133 | } | 143 | } |
| 134 | 144 | ||
| 135 | static long nullf_ctrl(BIO *b, int cmd, long num, void *ptr) | 145 | static long |
| 136 | { | 146 | nullf_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 147 | { | ||
| 137 | long ret; | 148 | long ret; |
| 138 | 149 | ||
| 139 | if (b->next_bio == NULL) return(0); | 150 | if (b->next_bio == NULL) |
| 140 | switch(cmd) | 151 | return (0); |
| 141 | { | 152 | switch (cmd) { |
| 142 | case BIO_C_DO_STATE_MACHINE: | 153 | case BIO_C_DO_STATE_MACHINE: |
| 143 | BIO_clear_retry_flags(b); | 154 | BIO_clear_retry_flags(b); |
| 144 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 155 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 145 | BIO_copy_next_retry(b); | 156 | BIO_copy_next_retry(b); |
| 146 | break; | 157 | break; |
| 147 | case BIO_CTRL_DUP: | 158 | case BIO_CTRL_DUP: |
| 148 | ret=0L; | 159 | ret = 0L; |
| 149 | break; | 160 | break; |
| 150 | default: | 161 | default: |
| 151 | ret=BIO_ctrl(b->next_bio,cmd,num,ptr); | 162 | ret = BIO_ctrl(b->next_bio, cmd, num, ptr); |
| 152 | } | ||
| 153 | return(ret); | ||
| 154 | } | 163 | } |
| 164 | return (ret); | ||
| 165 | } | ||
| 155 | 166 | ||
| 156 | static long nullf_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) | 167 | static long |
| 157 | { | 168 | nullf_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 158 | long ret=1; | 169 | { |
| 170 | long ret = 1; | ||
| 159 | 171 | ||
| 160 | if (b->next_bio == NULL) return(0); | 172 | if (b->next_bio == NULL) |
| 161 | switch (cmd) | 173 | return (0); |
| 162 | { | 174 | switch (cmd) { |
| 163 | default: | 175 | default: |
| 164 | ret=BIO_callback_ctrl(b->next_bio,cmd,fp); | 176 | ret = BIO_callback_ctrl(b->next_bio, cmd, fp); |
| 165 | break; | 177 | break; |
| 166 | } | ||
| 167 | return(ret); | ||
| 168 | } | 178 | } |
| 169 | 179 | return (ret); | |
| 170 | static int nullf_gets(BIO *bp, char *buf, int size) | 180 | } |
| 171 | { | 181 | |
| 172 | if (bp->next_bio == NULL) return(0); | 182 | static int |
| 173 | return(BIO_gets(bp->next_bio,buf,size)); | 183 | nullf_gets(BIO *bp, char *buf, int size) |
| 174 | } | 184 | { |
| 175 | 185 | if (bp->next_bio == NULL) | |
| 176 | 186 | return (0); | |
| 177 | static int nullf_puts(BIO *bp, const char *str) | 187 | return (BIO_gets(bp->next_bio, buf, size)); |
| 178 | { | 188 | } |
| 179 | if (bp->next_bio == NULL) return(0); | 189 | |
| 180 | return(BIO_puts(bp->next_bio,str)); | 190 | static int |
| 181 | } | 191 | nullf_puts(BIO *bp, const char *str) |
| 182 | 192 | { | |
| 183 | 193 | if (bp->next_bio == NULL) | |
| 194 | return (0); | ||
| 195 | return (BIO_puts(bp->next_bio, str)); | ||
| 196 | } | ||
diff --git a/src/lib/libssl/src/crypto/bio/bio.h b/src/lib/libssl/src/crypto/bio/bio.h index 05699ab212..4f1d02ada5 100644 --- a/src/lib/libssl/src/crypto/bio/bio.h +++ b/src/lib/libssl/src/crypto/bio/bio.h | |||
| @@ -151,7 +151,7 @@ extern "C" { | |||
| 151 | 151 | ||
| 152 | #define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37 /* flag whether the last */ | 152 | #define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37 /* flag whether the last */ |
| 153 | #define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38 /* I/O operation tiemd out */ | 153 | #define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38 /* I/O operation tiemd out */ |
| 154 | 154 | ||
| 155 | /* #ifdef IP_MTU_DISCOVER */ | 155 | /* #ifdef IP_MTU_DISCOVER */ |
| 156 | #define BIO_CTRL_DGRAM_MTU_DISCOVER 39 /* set DF bit on egress packets */ | 156 | #define BIO_CTRL_DGRAM_MTU_DISCOVER 39 /* set DF bit on egress packets */ |
| 157 | /* #endif */ | 157 | /* #endif */ |
| @@ -282,9 +282,10 @@ void BIO_clear_flags(BIO *b, int flags); | |||
| 282 | #define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) | 282 | #define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) |
| 283 | #define BIO_cb_post(a) ((a)&BIO_CB_RETURN) | 283 | #define BIO_cb_post(a) ((a)&BIO_CB_RETURN) |
| 284 | 284 | ||
| 285 | long (*BIO_get_callback(const BIO *b)) (struct bio_st *,int,const char *,int, long,long); | 285 | long (*BIO_get_callback(const BIO *b))(struct bio_st *, int, const char *, |
| 286 | void BIO_set_callback(BIO *b, | 286 | int, long, long); |
| 287 | long (*callback)(struct bio_st *,int,const char *,int, long,long)); | 287 | void BIO_set_callback(BIO *b, |
| 288 | long (*callback)(struct bio_st *, int, const char *, int, long, long)); | ||
| 288 | char *BIO_get_callback_arg(const BIO *b); | 289 | char *BIO_get_callback_arg(const BIO *b); |
| 289 | void BIO_set_callback_arg(BIO *b, char *arg); | 290 | void BIO_set_callback_arg(BIO *b, char *arg); |
| 290 | 291 | ||
| @@ -293,8 +294,7 @@ int BIO_method_type(const BIO *b); | |||
| 293 | 294 | ||
| 294 | typedef void bio_info_cb(struct bio_st *, int, const char *, int, long, long); | 295 | typedef void bio_info_cb(struct bio_st *, int, const char *, int, long, long); |
| 295 | 296 | ||
| 296 | typedef struct bio_method_st | 297 | typedef struct bio_method_st { |
| 297 | { | ||
| 298 | int type; | 298 | int type; |
| 299 | const char *name; | 299 | const char *name; |
| 300 | int (*bwrite)(BIO *, const char *, int); | 300 | int (*bwrite)(BIO *, const char *, int); |
| @@ -304,14 +304,13 @@ typedef struct bio_method_st | |||
| 304 | long (*ctrl)(BIO *, int, long, void *); | 304 | long (*ctrl)(BIO *, int, long, void *); |
| 305 | int (*create)(BIO *); | 305 | int (*create)(BIO *); |
| 306 | int (*destroy)(BIO *); | 306 | int (*destroy)(BIO *); |
| 307 | long (*callback_ctrl)(BIO *, int, bio_info_cb *); | 307 | long (*callback_ctrl)(BIO *, int, bio_info_cb *); |
| 308 | } BIO_METHOD; | 308 | } BIO_METHOD; |
| 309 | 309 | ||
| 310 | struct bio_st | 310 | struct bio_st { |
| 311 | { | ||
| 312 | BIO_METHOD *method; | 311 | BIO_METHOD *method; |
| 313 | /* bio, mode, argp, argi, argl, ret */ | 312 | /* bio, mode, argp, argi, argl, ret */ |
| 314 | long (*callback)(struct bio_st *,int,const char *,int, long,long); | 313 | long (*callback)(struct bio_st *, int, const char *, int, long, long); |
| 315 | char *cb_arg; /* first argument for the callback */ | 314 | char *cb_arg; /* first argument for the callback */ |
| 316 | 315 | ||
| 317 | int init; | 316 | int init; |
| @@ -327,12 +326,11 @@ struct bio_st | |||
| 327 | unsigned long num_write; | 326 | unsigned long num_write; |
| 328 | 327 | ||
| 329 | CRYPTO_EX_DATA ex_data; | 328 | CRYPTO_EX_DATA ex_data; |
| 330 | }; | 329 | }; |
| 331 | 330 | ||
| 332 | DECLARE_STACK_OF(BIO) | 331 | DECLARE_STACK_OF(BIO) |
| 333 | 332 | ||
| 334 | typedef struct bio_f_buffer_ctx_struct | 333 | typedef struct bio_f_buffer_ctx_struct { |
| 335 | { | ||
| 336 | /* Buffers are setup like this: | 334 | /* Buffers are setup like this: |
| 337 | * | 335 | * |
| 338 | * <---------------------- size -----------------------> | 336 | * <---------------------- size -----------------------> |
| @@ -346,30 +344,28 @@ typedef struct bio_f_buffer_ctx_struct | |||
| 346 | int ibuf_size; /* how big is the input buffer */ | 344 | int ibuf_size; /* how big is the input buffer */ |
| 347 | int obuf_size; /* how big is the output buffer */ | 345 | int obuf_size; /* how big is the output buffer */ |
| 348 | 346 | ||
| 349 | char *ibuf; /* the char array */ | 347 | char *ibuf; /* the char array */ |
| 350 | int ibuf_len; /* how many bytes are in it */ | 348 | int ibuf_len; /* how many bytes are in it */ |
| 351 | int ibuf_off; /* write/read offset */ | 349 | int ibuf_off; /* write/read offset */ |
| 352 | 350 | ||
| 353 | char *obuf; /* the char array */ | 351 | char *obuf; /* the char array */ |
| 354 | int obuf_len; /* how many bytes are in it */ | 352 | int obuf_len; /* how many bytes are in it */ |
| 355 | int obuf_off; /* write/read offset */ | 353 | int obuf_off; /* write/read offset */ |
| 356 | } BIO_F_BUFFER_CTX; | 354 | } BIO_F_BUFFER_CTX; |
| 357 | 355 | ||
| 358 | /* Prefix and suffix callback in ASN1 BIO */ | 356 | /* Prefix and suffix callback in ASN1 BIO */ |
| 359 | typedef int asn1_ps_func(BIO *b, unsigned char **pbuf, int *plen, void *parg); | 357 | typedef int asn1_ps_func(BIO *b, unsigned char **pbuf, int *plen, void *parg); |
| 360 | 358 | ||
| 361 | #ifndef OPENSSL_NO_SCTP | 359 | #ifndef OPENSSL_NO_SCTP |
| 362 | /* SCTP parameter structs */ | 360 | /* SCTP parameter structs */ |
| 363 | struct bio_dgram_sctp_sndinfo | 361 | struct bio_dgram_sctp_sndinfo { |
| 364 | { | ||
| 365 | uint16_t snd_sid; | 362 | uint16_t snd_sid; |
| 366 | uint16_t snd_flags; | 363 | uint16_t snd_flags; |
| 367 | uint32_t snd_ppid; | 364 | uint32_t snd_ppid; |
| 368 | uint32_t snd_context; | 365 | uint32_t snd_context; |
| 369 | }; | 366 | }; |
| 370 | 367 | ||
| 371 | struct bio_dgram_sctp_rcvinfo | 368 | struct bio_dgram_sctp_rcvinfo { |
| 372 | { | ||
| 373 | uint16_t rcv_sid; | 369 | uint16_t rcv_sid; |
| 374 | uint16_t rcv_ssn; | 370 | uint16_t rcv_ssn; |
| 375 | uint16_t rcv_flags; | 371 | uint16_t rcv_flags; |
| @@ -377,13 +373,12 @@ struct bio_dgram_sctp_rcvinfo | |||
| 377 | uint32_t rcv_tsn; | 373 | uint32_t rcv_tsn; |
| 378 | uint32_t rcv_cumtsn; | 374 | uint32_t rcv_cumtsn; |
| 379 | uint32_t rcv_context; | 375 | uint32_t rcv_context; |
| 380 | }; | 376 | }; |
| 381 | 377 | ||
| 382 | struct bio_dgram_sctp_prinfo | 378 | struct bio_dgram_sctp_prinfo { |
| 383 | { | ||
| 384 | uint16_t pr_policy; | 379 | uint16_t pr_policy; |
| 385 | uint32_t pr_value; | 380 | uint32_t pr_value; |
| 386 | }; | 381 | }; |
| 387 | #endif | 382 | #endif |
| 388 | 383 | ||
| 389 | /* connect BIO stuff */ | 384 | /* connect BIO stuff */ |
| @@ -519,7 +514,7 @@ struct bio_dgram_sctp_prinfo | |||
| 519 | /* If you are wondering why this isn't defined, its because CONST_STRICT is | 514 | /* If you are wondering why this isn't defined, its because CONST_STRICT is |
| 520 | * purely a compile-time kludge to allow const to be checked. | 515 | * purely a compile-time kludge to allow const to be checked. |
| 521 | */ | 516 | */ |
| 522 | int BIO_read_filename(BIO *b,const char *name); | 517 | int BIO_read_filename(BIO *b, const char *name); |
| 523 | #else | 518 | #else |
| 524 | #define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ | 519 | #define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ |
| 525 | BIO_CLOSE|BIO_FP_READ,(char *)name) | 520 | BIO_CLOSE|BIO_FP_READ,(char *)name) |
| @@ -611,22 +606,27 @@ int BIO_ctrl_reset_read_request(BIO *b); | |||
| 611 | /* These two aren't currently implemented */ | 606 | /* These two aren't currently implemented */ |
| 612 | /* int BIO_get_ex_num(BIO *bio); */ | 607 | /* int BIO_get_ex_num(BIO *bio); */ |
| 613 | /* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */ | 608 | /* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */ |
| 614 | int BIO_set_ex_data(BIO *bio,int idx,void *data); | 609 | int BIO_set_ex_data(BIO *bio, int idx, void *data); |
| 615 | void *BIO_get_ex_data(BIO *bio,int idx); | 610 | void *BIO_get_ex_data(BIO *bio, int idx); |
| 616 | int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | 611 | int |
| 617 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); | 612 | BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, |
| 613 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); | ||
| 618 | unsigned long BIO_number_read(BIO *bio); | 614 | unsigned long BIO_number_read(BIO *bio); |
| 619 | unsigned long BIO_number_written(BIO *bio); | 615 | unsigned long BIO_number_written(BIO *bio); |
| 620 | 616 | ||
| 621 | /* For BIO_f_asn1() */ | 617 | /* For BIO_f_asn1() */ |
| 622 | int BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, | 618 | int |
| 623 | asn1_ps_func *prefix_free); | 619 | BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, |
| 624 | int BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, | 620 | asn1_ps_func *prefix_free); |
| 625 | asn1_ps_func **pprefix_free); | 621 | int |
| 626 | int BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, | 622 | BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, |
| 627 | asn1_ps_func *suffix_free); | 623 | asn1_ps_func **pprefix_free); |
| 628 | int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, | 624 | int |
| 629 | asn1_ps_func **psuffix_free); | 625 | BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, |
| 626 | asn1_ps_func *suffix_free); | ||
| 627 | int | ||
| 628 | BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, | ||
| 629 | asn1_ps_func **psuffix_free); | ||
| 630 | 630 | ||
| 631 | # ifndef OPENSSL_NO_FP_API | 631 | # ifndef OPENSSL_NO_FP_API |
| 632 | BIO_METHOD *BIO_s_file(void ); | 632 | BIO_METHOD *BIO_s_file(void ); |
| @@ -635,22 +635,23 @@ BIO *BIO_new_fp(FILE *stream, int close_flag); | |||
| 635 | # define BIO_s_file_internal BIO_s_file | 635 | # define BIO_s_file_internal BIO_s_file |
| 636 | # endif | 636 | # endif |
| 637 | BIO * BIO_new(BIO_METHOD *type); | 637 | BIO * BIO_new(BIO_METHOD *type); |
| 638 | int BIO_set(BIO *a,BIO_METHOD *type); | 638 | int BIO_set(BIO *a, BIO_METHOD *type); |
| 639 | int BIO_free(BIO *a); | 639 | int BIO_free(BIO *a); |
| 640 | void BIO_vfree(BIO *a); | 640 | void BIO_vfree(BIO *a); |
| 641 | int BIO_read(BIO *b, void *data, int len); | 641 | int BIO_read(BIO *b, void *data, int len); |
| 642 | int BIO_gets(BIO *bp,char *buf, int size); | 642 | int BIO_gets(BIO *bp, char *buf, int size); |
| 643 | int BIO_write(BIO *b, const void *data, int len); | 643 | int BIO_write(BIO *b, const void *data, int len); |
| 644 | int BIO_puts(BIO *bp,const char *buf); | 644 | int BIO_puts(BIO *bp, const char *buf); |
| 645 | int BIO_indent(BIO *b,int indent,int max); | 645 | int BIO_indent(BIO *b, int indent, int max); |
| 646 | long BIO_ctrl(BIO *bp,int cmd,long larg,void *parg); | 646 | long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg); |
| 647 | long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long)); | 647 | long BIO_callback_ctrl(BIO *b, int cmd, |
| 648 | char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg); | 648 | void (*fp)(struct bio_st *, int, const char *, int, long, long)); |
| 649 | long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg); | 649 | char * BIO_ptr_ctrl(BIO *bp, int cmd, long larg); |
| 650 | BIO * BIO_push(BIO *b,BIO *append); | 650 | long BIO_int_ctrl(BIO *bp, int cmd, long larg, int iarg); |
| 651 | BIO * BIO_push(BIO *b, BIO *append); | ||
| 651 | BIO * BIO_pop(BIO *b); | 652 | BIO * BIO_pop(BIO *b); |
| 652 | void BIO_free_all(BIO *a); | 653 | void BIO_free_all(BIO *a); |
| 653 | BIO * BIO_find_type(BIO *b,int bio_type); | 654 | BIO * BIO_find_type(BIO *b, int bio_type); |
| 654 | BIO * BIO_next(BIO *b); | 655 | BIO * BIO_next(BIO *b); |
| 655 | BIO * BIO_get_retry_BIO(BIO *bio, int *reason); | 656 | BIO * BIO_get_retry_BIO(BIO *bio, int *reason); |
| 656 | int BIO_get_retry_reason(BIO *bio); | 657 | int BIO_get_retry_reason(BIO *bio); |
| @@ -661,8 +662,8 @@ int BIO_nread(BIO *bio, char **buf, int num); | |||
| 661 | int BIO_nwrite0(BIO *bio, char **buf); | 662 | int BIO_nwrite0(BIO *bio, char **buf); |
| 662 | int BIO_nwrite(BIO *bio, char **buf, int num); | 663 | int BIO_nwrite(BIO *bio, char **buf, int num); |
| 663 | 664 | ||
| 664 | long BIO_debug_callback(BIO *bio,int cmd,const char *argp,int argi, | 665 | long BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi, |
| 665 | long argl,long ret); | 666 | long argl, long ret); |
| 666 | 667 | ||
| 667 | BIO_METHOD *BIO_s_mem(void); | 668 | BIO_METHOD *BIO_s_mem(void); |
| 668 | BIO *BIO_new_mem_buf(void *buf, int len); | 669 | BIO *BIO_new_mem_buf(void *buf, int len); |
| @@ -696,12 +697,14 @@ int BIO_dgram_non_fatal_error(int error); | |||
| 696 | 697 | ||
| 697 | int BIO_fd_should_retry(int i); | 698 | int BIO_fd_should_retry(int i); |
| 698 | int BIO_fd_non_fatal_error(int error); | 699 | int BIO_fd_non_fatal_error(int error); |
| 699 | int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), | 700 | int |
| 700 | void *u, const char *s, int len); | 701 | BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), |
| 701 | int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), | 702 | void *u, const char *s, int len); |
| 702 | void *u, const char *s, int len, int indent); | 703 | int |
| 703 | int BIO_dump(BIO *b,const char *bytes,int len); | 704 | BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), |
| 704 | int BIO_dump_indent(BIO *b,const char *bytes,int len,int indent); | 705 | void *u, const char *s, int len, int indent); |
| 706 | int BIO_dump(BIO *b, const char *bytes, int len); | ||
| 707 | int BIO_dump_indent(BIO *b, const char *bytes, int len, int indent); | ||
| 705 | #ifndef OPENSSL_NO_FP_API | 708 | #ifndef OPENSSL_NO_FP_API |
| 706 | int BIO_dump_fp(FILE *fp, const char *s, int len); | 709 | int BIO_dump_fp(FILE *fp, const char *s, int len); |
| 707 | int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); | 710 | int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); |
| @@ -717,23 +720,24 @@ struct hostent *BIO_gethostbyname(const char *name); | |||
| 717 | */ | 720 | */ |
| 718 | int BIO_sock_error(int sock); | 721 | int BIO_sock_error(int sock); |
| 719 | int BIO_socket_ioctl(int fd, long type, void *arg); | 722 | int BIO_socket_ioctl(int fd, long type, void *arg); |
| 720 | int BIO_socket_nbio(int fd,int mode); | 723 | int BIO_socket_nbio(int fd, int mode); |
| 721 | int BIO_get_port(const char *str, unsigned short *port_ptr); | 724 | int BIO_get_port(const char *str, unsigned short *port_ptr); |
| 722 | int BIO_get_host_ip(const char *str, unsigned char *ip); | 725 | int BIO_get_host_ip(const char *str, unsigned char *ip); |
| 723 | int BIO_get_accept_socket(char *host_port,int mode); | 726 | int BIO_get_accept_socket(char *host_port, int mode); |
| 724 | int BIO_accept(int sock,char **ip_port); | 727 | int BIO_accept(int sock, char **ip_port); |
| 725 | int BIO_sock_init(void ); | 728 | int BIO_sock_init(void ); |
| 726 | void BIO_sock_cleanup(void); | 729 | void BIO_sock_cleanup(void); |
| 727 | int BIO_set_tcp_ndelay(int sock,int turn_on); | 730 | int BIO_set_tcp_ndelay(int sock, int turn_on); |
| 728 | 731 | ||
| 729 | BIO *BIO_new_socket(int sock, int close_flag); | 732 | BIO *BIO_new_socket(int sock, int close_flag); |
| 730 | BIO *BIO_new_dgram(int fd, int close_flag); | 733 | BIO *BIO_new_dgram(int fd, int close_flag); |
| 731 | #ifndef OPENSSL_NO_SCTP | 734 | #ifndef OPENSSL_NO_SCTP |
| 732 | BIO *BIO_new_dgram_sctp(int fd, int close_flag); | 735 | BIO *BIO_new_dgram_sctp(int fd, int close_flag); |
| 733 | int BIO_dgram_is_sctp(BIO *bio); | 736 | int BIO_dgram_is_sctp(BIO *bio); |
| 734 | int BIO_dgram_sctp_notification_cb(BIO *b, | 737 | int |
| 735 | void (*handle_notifications)(BIO *bio, void *context, void *buf), | 738 | BIO_dgram_sctp_notification_cb(BIO *b, |
| 736 | void *context); | 739 | void (*handle_notifications)(BIO *bio, void *context, void *buf), |
| 740 | void *context); | ||
| 737 | int BIO_dgram_sctp_wait_for_dry(BIO *b); | 741 | int BIO_dgram_sctp_wait_for_dry(BIO *b); |
| 738 | int BIO_dgram_sctp_msg_waiting(BIO *b); | 742 | int BIO_dgram_sctp_msg_waiting(BIO *b); |
| 739 | #endif | 743 | #endif |
| @@ -741,8 +745,9 @@ BIO *BIO_new_fd(int fd, int close_flag); | |||
| 741 | BIO *BIO_new_connect(char *host_port); | 745 | BIO *BIO_new_connect(char *host_port); |
| 742 | BIO *BIO_new_accept(char *host_port); | 746 | BIO *BIO_new_accept(char *host_port); |
| 743 | 747 | ||
| 744 | int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, | 748 | int |
| 745 | BIO **bio2, size_t writebuf2); | 749 | BIO_new_bio_pair(BIO **bio1, size_t writebuf1, |
| 750 | BIO **bio2, size_t writebuf2); | ||
| 746 | /* If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. | 751 | /* If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. |
| 747 | * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. | 752 | * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. |
| 748 | * Size 0 uses default value. | 753 | * Size 0 uses default value. |
| @@ -757,14 +762,18 @@ void BIO_copy_next_retry(BIO *b); | |||
| 757 | #else | 762 | #else |
| 758 | # define __bio_h__attr__(x) | 763 | # define __bio_h__attr__(x) |
| 759 | #endif | 764 | #endif |
| 760 | int BIO_printf(BIO *bio, const char *format, ...) | 765 | int |
| 761 | __bio_h__attr__((__format__(__printf__,2,3))); | 766 | BIO_printf(BIO *bio, const char *format, ...) |
| 762 | int BIO_vprintf(BIO *bio, const char *format, va_list args) | 767 | __bio_h__attr__((__format__(__printf__, 2, 3))); |
| 763 | __bio_h__attr__((__format__(__printf__,2,0))); | 768 | int |
| 764 | int BIO_snprintf(char *buf, size_t n, const char *format, ...) | 769 | BIO_vprintf(BIO *bio, const char *format, va_list args) |
| 765 | __bio_h__attr__((__format__(__printf__,3,4))); | 770 | __bio_h__attr__((__format__(__printf__, 2, 0))); |
| 766 | int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) | 771 | int |
| 767 | __bio_h__attr__((__format__(__printf__,3,0))); | 772 | BIO_snprintf(char *buf, size_t n, const char *format, ...) |
| 773 | __bio_h__attr__((__format__(__printf__, 3, 4))); | ||
| 774 | int | ||
| 775 | BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) | ||
| 776 | __bio_h__attr__((__format__(__printf__, 3, 0))); | ||
| 768 | #undef __bio_h__attr__ | 777 | #undef __bio_h__attr__ |
| 769 | 778 | ||
| 770 | /* BEGIN ERROR CODES */ | 779 | /* BEGIN ERROR CODES */ |
diff --git a/src/lib/libssl/src/crypto/bio/bio_cb.c b/src/lib/libssl/src/crypto/bio/bio_cb.c index 78c8974ab4..3e110f3751 100644 --- a/src/lib/libssl/src/crypto/bio/bio_cb.c +++ b/src/lib/libssl/src/crypto/bio/bio_cb.c | |||
| @@ -63,81 +63,85 @@ | |||
| 63 | #include <openssl/bio.h> | 63 | #include <openssl/bio.h> |
| 64 | #include <openssl/err.h> | 64 | #include <openssl/err.h> |
| 65 | 65 | ||
| 66 | long BIO_debug_callback(BIO *bio, int cmd, const char *argp, | 66 | long |
| 67 | int argi, long argl, long ret) | 67 | BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi, long argl, |
| 68 | { | 68 | long ret) |
| 69 | { | ||
| 69 | BIO *b; | 70 | BIO *b; |
| 70 | char buf[256]; | 71 | char buf[256]; |
| 71 | char *p; | 72 | char *p; |
| 72 | long r=1; | 73 | long r = 1; |
| 73 | size_t p_maxlen; | 74 | size_t p_maxlen; |
| 74 | 75 | ||
| 75 | if (BIO_CB_RETURN & cmd) | 76 | if (BIO_CB_RETURN & cmd) |
| 76 | r=ret; | 77 | r = ret; |
| 77 | 78 | ||
| 78 | (void) snprintf(buf,sizeof buf,"BIO[%08lX]:",(unsigned long)bio); | 79 | (void) snprintf(buf, sizeof buf, "BIO[%08lX]:", (unsigned long)bio); |
| 79 | p= &(buf[14]); | 80 | p = &(buf[14]); |
| 80 | p_maxlen = sizeof buf - 14; | 81 | p_maxlen = sizeof buf - 14; |
| 81 | switch (cmd) | 82 | switch (cmd) { |
| 82 | { | ||
| 83 | case BIO_CB_FREE: | 83 | case BIO_CB_FREE: |
| 84 | (void) snprintf(p,p_maxlen,"Free - %s\n",bio->method->name); | 84 | (void) snprintf(p, p_maxlen, "Free - %s\n", bio->method->name); |
| 85 | break; | 85 | break; |
| 86 | case BIO_CB_READ: | 86 | case BIO_CB_READ: |
| 87 | if (bio->method->type & BIO_TYPE_DESCRIPTOR) | 87 | if (bio->method->type & BIO_TYPE_DESCRIPTOR) |
| 88 | (void) snprintf(p,p_maxlen,"read(%d,%lu) - %s fd=%d\n", | 88 | (void) snprintf(p, p_maxlen, |
| 89 | bio->num,(unsigned long)argi, | 89 | "read(%d,%lu) - %s fd=%d\n", |
| 90 | bio->method->name,bio->num); | 90 | bio->num,(unsigned long)argi, |
| 91 | bio->method->name, bio->num); | ||
| 91 | else | 92 | else |
| 92 | (void) snprintf(p,p_maxlen,"read(%d,%lu) - %s\n", | 93 | (void) snprintf(p, p_maxlen, "read(%d,%lu) - %s\n", |
| 93 | bio->num,(unsigned long)argi, | 94 | bio->num, (unsigned long)argi, bio->method->name); |
| 94 | bio->method->name); | ||
| 95 | break; | 95 | break; |
| 96 | case BIO_CB_WRITE: | 96 | case BIO_CB_WRITE: |
| 97 | if (bio->method->type & BIO_TYPE_DESCRIPTOR) | 97 | if (bio->method->type & BIO_TYPE_DESCRIPTOR) |
| 98 | (void) snprintf(p,p_maxlen,"write(%d,%lu) - %s fd=%d\n", | 98 | (void) snprintf(p, p_maxlen, |
| 99 | bio->num,(unsigned long)argi, | 99 | "write(%d,%lu) - %s fd=%d\n", |
| 100 | bio->method->name,bio->num); | 100 | bio->num, (unsigned long)argi, |
| 101 | bio->method->name, bio->num); | ||
| 101 | else | 102 | else |
| 102 | (void) snprintf(p,p_maxlen,"write(%d,%lu) - %s\n", | 103 | (void) snprintf(p, p_maxlen, "write(%d,%lu) - %s\n", |
| 103 | bio->num,(unsigned long)argi, | 104 | bio->num, (unsigned long)argi, bio->method->name); |
| 104 | bio->method->name); | ||
| 105 | break; | 105 | break; |
| 106 | case BIO_CB_PUTS: | 106 | case BIO_CB_PUTS: |
| 107 | (void) snprintf(p,p_maxlen,"puts() - %s\n",bio->method->name); | 107 | (void) snprintf(p, p_maxlen, |
| 108 | "puts() - %s\n", bio->method->name); | ||
| 108 | break; | 109 | break; |
| 109 | case BIO_CB_GETS: | 110 | case BIO_CB_GETS: |
| 110 | (void) snprintf(p,p_maxlen,"gets(%lu) - %s\n",(unsigned long)argi,bio->method->name); | 111 | (void) snprintf(p, p_maxlen, "gets(%lu) - %s\n", |
| 112 | (unsigned long)argi, bio->method->name); | ||
| 111 | break; | 113 | break; |
| 112 | case BIO_CB_CTRL: | 114 | case BIO_CB_CTRL: |
| 113 | (void) snprintf(p,p_maxlen,"ctrl(%lu) - %s\n",(unsigned long)argi,bio->method->name); | 115 | (void) snprintf(p, p_maxlen, "ctrl(%lu) - %s\n", |
| 116 | (unsigned long)argi, bio->method->name); | ||
| 114 | break; | 117 | break; |
| 115 | case BIO_CB_RETURN|BIO_CB_READ: | 118 | case BIO_CB_RETURN|BIO_CB_READ: |
| 116 | (void) snprintf(p,p_maxlen,"read return %ld\n",ret); | 119 | (void) snprintf(p, p_maxlen, "read return %ld\n", ret); |
| 117 | break; | 120 | break; |
| 118 | case BIO_CB_RETURN|BIO_CB_WRITE: | 121 | case BIO_CB_RETURN|BIO_CB_WRITE: |
| 119 | (void) snprintf(p,p_maxlen,"write return %ld\n",ret); | 122 | (void) snprintf(p, p_maxlen, "write return %ld\n", ret); |
| 120 | break; | 123 | break; |
| 121 | case BIO_CB_RETURN|BIO_CB_GETS: | 124 | case BIO_CB_RETURN|BIO_CB_GETS: |
| 122 | (void) snprintf(p,p_maxlen,"gets return %ld\n",ret); | 125 | (void) snprintf(p, p_maxlen, "gets return %ld\n", ret); |
| 123 | break; | 126 | break; |
| 124 | case BIO_CB_RETURN|BIO_CB_PUTS: | 127 | case BIO_CB_RETURN|BIO_CB_PUTS: |
| 125 | (void) snprintf(p,p_maxlen,"puts return %ld\n",ret); | 128 | (void) snprintf(p, p_maxlen, "puts return %ld\n", ret); |
| 126 | break; | 129 | break; |
| 127 | case BIO_CB_RETURN|BIO_CB_CTRL: | 130 | case BIO_CB_RETURN|BIO_CB_CTRL: |
| 128 | (void) snprintf(p,p_maxlen,"ctrl return %ld\n",ret); | 131 | (void) snprintf(p, p_maxlen, "ctrl return %ld\n", ret); |
| 129 | break; | 132 | break; |
| 130 | default: | 133 | default: |
| 131 | (void) snprintf(p,p_maxlen,"bio callback - unknown type (%d)\n",cmd); | 134 | (void) snprintf(p, p_maxlen, |
| 135 | "bio callback - unknown type (%d)\n", cmd); | ||
| 132 | break; | 136 | break; |
| 133 | } | 137 | } |
| 134 | 138 | ||
| 135 | b=(BIO *)bio->cb_arg; | 139 | b = (BIO *)bio->cb_arg; |
| 136 | if (b != NULL) | 140 | if (b != NULL) |
| 137 | BIO_write(b,buf,strlen(buf)); | 141 | BIO_write(b, buf, strlen(buf)); |
| 138 | #if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16) | 142 | #if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16) |
| 139 | else | 143 | else |
| 140 | fputs(buf,stderr); | 144 | fputs(buf, stderr); |
| 141 | #endif | 145 | #endif |
| 142 | return(r); | 146 | return (r); |
| 143 | } | 147 | } |
diff --git a/src/lib/libssl/src/crypto/bio/bio_err.c b/src/lib/libssl/src/crypto/bio/bio_err.c index 0dbfbd80d3..86e9a3082b 100644 --- a/src/lib/libssl/src/crypto/bio/bio_err.c +++ b/src/lib/libssl/src/crypto/bio/bio_err.c | |||
| @@ -68,88 +68,85 @@ | |||
| 68 | #define ERR_FUNC(func) ERR_PACK(ERR_LIB_BIO,func,0) | 68 | #define ERR_FUNC(func) ERR_PACK(ERR_LIB_BIO,func,0) |
| 69 | #define ERR_REASON(reason) ERR_PACK(ERR_LIB_BIO,0,reason) | 69 | #define ERR_REASON(reason) ERR_PACK(ERR_LIB_BIO,0,reason) |
| 70 | 70 | ||
| 71 | static ERR_STRING_DATA BIO_str_functs[]= | 71 | static ERR_STRING_DATA BIO_str_functs[]= { |
| 72 | { | 72 | {ERR_FUNC(BIO_F_ACPT_STATE), "ACPT_STATE"}, |
| 73 | {ERR_FUNC(BIO_F_ACPT_STATE), "ACPT_STATE"}, | 73 | {ERR_FUNC(BIO_F_BIO_ACCEPT), "BIO_accept"}, |
| 74 | {ERR_FUNC(BIO_F_BIO_ACCEPT), "BIO_accept"}, | 74 | {ERR_FUNC(BIO_F_BIO_BER_GET_HEADER), "BIO_BER_GET_HEADER"}, |
| 75 | {ERR_FUNC(BIO_F_BIO_BER_GET_HEADER), "BIO_BER_GET_HEADER"}, | 75 | {ERR_FUNC(BIO_F_BIO_CALLBACK_CTRL), "BIO_callback_ctrl"}, |
| 76 | {ERR_FUNC(BIO_F_BIO_CALLBACK_CTRL), "BIO_callback_ctrl"}, | 76 | {ERR_FUNC(BIO_F_BIO_CTRL), "BIO_ctrl"}, |
| 77 | {ERR_FUNC(BIO_F_BIO_CTRL), "BIO_ctrl"}, | 77 | {ERR_FUNC(BIO_F_BIO_GETHOSTBYNAME), "BIO_gethostbyname"}, |
| 78 | {ERR_FUNC(BIO_F_BIO_GETHOSTBYNAME), "BIO_gethostbyname"}, | 78 | {ERR_FUNC(BIO_F_BIO_GETS), "BIO_gets"}, |
| 79 | {ERR_FUNC(BIO_F_BIO_GETS), "BIO_gets"}, | 79 | {ERR_FUNC(BIO_F_BIO_GET_ACCEPT_SOCKET), "BIO_get_accept_socket"}, |
| 80 | {ERR_FUNC(BIO_F_BIO_GET_ACCEPT_SOCKET), "BIO_get_accept_socket"}, | 80 | {ERR_FUNC(BIO_F_BIO_GET_HOST_IP), "BIO_get_host_ip"}, |
| 81 | {ERR_FUNC(BIO_F_BIO_GET_HOST_IP), "BIO_get_host_ip"}, | 81 | {ERR_FUNC(BIO_F_BIO_GET_PORT), "BIO_get_port"}, |
| 82 | {ERR_FUNC(BIO_F_BIO_GET_PORT), "BIO_get_port"}, | 82 | {ERR_FUNC(BIO_F_BIO_MAKE_PAIR), "BIO_MAKE_PAIR"}, |
| 83 | {ERR_FUNC(BIO_F_BIO_MAKE_PAIR), "BIO_MAKE_PAIR"}, | 83 | {ERR_FUNC(BIO_F_BIO_NEW), "BIO_new"}, |
| 84 | {ERR_FUNC(BIO_F_BIO_NEW), "BIO_new"}, | 84 | {ERR_FUNC(BIO_F_BIO_NEW_FILE), "BIO_new_file"}, |
| 85 | {ERR_FUNC(BIO_F_BIO_NEW_FILE), "BIO_new_file"}, | 85 | {ERR_FUNC(BIO_F_BIO_NEW_MEM_BUF), "BIO_new_mem_buf"}, |
| 86 | {ERR_FUNC(BIO_F_BIO_NEW_MEM_BUF), "BIO_new_mem_buf"}, | 86 | {ERR_FUNC(BIO_F_BIO_NREAD), "BIO_nread"}, |
| 87 | {ERR_FUNC(BIO_F_BIO_NREAD), "BIO_nread"}, | 87 | {ERR_FUNC(BIO_F_BIO_NREAD0), "BIO_nread0"}, |
| 88 | {ERR_FUNC(BIO_F_BIO_NREAD0), "BIO_nread0"}, | 88 | {ERR_FUNC(BIO_F_BIO_NWRITE), "BIO_nwrite"}, |
| 89 | {ERR_FUNC(BIO_F_BIO_NWRITE), "BIO_nwrite"}, | 89 | {ERR_FUNC(BIO_F_BIO_NWRITE0), "BIO_nwrite0"}, |
| 90 | {ERR_FUNC(BIO_F_BIO_NWRITE0), "BIO_nwrite0"}, | 90 | {ERR_FUNC(BIO_F_BIO_PUTS), "BIO_puts"}, |
| 91 | {ERR_FUNC(BIO_F_BIO_PUTS), "BIO_puts"}, | 91 | {ERR_FUNC(BIO_F_BIO_READ), "BIO_read"}, |
| 92 | {ERR_FUNC(BIO_F_BIO_READ), "BIO_read"}, | 92 | {ERR_FUNC(BIO_F_BIO_SOCK_INIT), "BIO_sock_init"}, |
| 93 | {ERR_FUNC(BIO_F_BIO_SOCK_INIT), "BIO_sock_init"}, | 93 | {ERR_FUNC(BIO_F_BIO_WRITE), "BIO_write"}, |
| 94 | {ERR_FUNC(BIO_F_BIO_WRITE), "BIO_write"}, | 94 | {ERR_FUNC(BIO_F_BUFFER_CTRL), "BUFFER_CTRL"}, |
| 95 | {ERR_FUNC(BIO_F_BUFFER_CTRL), "BUFFER_CTRL"}, | 95 | {ERR_FUNC(BIO_F_CONN_CTRL), "CONN_CTRL"}, |
| 96 | {ERR_FUNC(BIO_F_CONN_CTRL), "CONN_CTRL"}, | 96 | {ERR_FUNC(BIO_F_CONN_STATE), "CONN_STATE"}, |
| 97 | {ERR_FUNC(BIO_F_CONN_STATE), "CONN_STATE"}, | 97 | {ERR_FUNC(BIO_F_DGRAM_SCTP_READ), "DGRAM_SCTP_READ"}, |
| 98 | {ERR_FUNC(BIO_F_DGRAM_SCTP_READ), "DGRAM_SCTP_READ"}, | 98 | {ERR_FUNC(BIO_F_FILE_CTRL), "FILE_CTRL"}, |
| 99 | {ERR_FUNC(BIO_F_FILE_CTRL), "FILE_CTRL"}, | 99 | {ERR_FUNC(BIO_F_FILE_READ), "FILE_READ"}, |
| 100 | {ERR_FUNC(BIO_F_FILE_READ), "FILE_READ"}, | 100 | {ERR_FUNC(BIO_F_LINEBUFFER_CTRL), "LINEBUFFER_CTRL"}, |
| 101 | {ERR_FUNC(BIO_F_LINEBUFFER_CTRL), "LINEBUFFER_CTRL"}, | 101 | {ERR_FUNC(BIO_F_MEM_READ), "MEM_READ"}, |
| 102 | {ERR_FUNC(BIO_F_MEM_READ), "MEM_READ"}, | 102 | {ERR_FUNC(BIO_F_MEM_WRITE), "MEM_WRITE"}, |
| 103 | {ERR_FUNC(BIO_F_MEM_WRITE), "MEM_WRITE"}, | 103 | {ERR_FUNC(BIO_F_SSL_NEW), "SSL_new"}, |
| 104 | {ERR_FUNC(BIO_F_SSL_NEW), "SSL_new"}, | 104 | {ERR_FUNC(BIO_F_WSASTARTUP), "WSASTARTUP"}, |
| 105 | {ERR_FUNC(BIO_F_WSASTARTUP), "WSASTARTUP"}, | 105 | {0, NULL} |
| 106 | {0,NULL} | 106 | }; |
| 107 | }; | ||
| 108 | 107 | ||
| 109 | static ERR_STRING_DATA BIO_str_reasons[]= | 108 | static ERR_STRING_DATA BIO_str_reasons[]= { |
| 110 | { | 109 | {ERR_REASON(BIO_R_ACCEPT_ERROR) , "accept error"}, |
| 111 | {ERR_REASON(BIO_R_ACCEPT_ERROR) ,"accept error"}, | 110 | {ERR_REASON(BIO_R_BAD_FOPEN_MODE) , "bad fopen mode"}, |
| 112 | {ERR_REASON(BIO_R_BAD_FOPEN_MODE) ,"bad fopen mode"}, | 111 | {ERR_REASON(BIO_R_BAD_HOSTNAME_LOOKUP) , "bad hostname lookup"}, |
| 113 | {ERR_REASON(BIO_R_BAD_HOSTNAME_LOOKUP) ,"bad hostname lookup"}, | 112 | {ERR_REASON(BIO_R_BROKEN_PIPE) , "broken pipe"}, |
| 114 | {ERR_REASON(BIO_R_BROKEN_PIPE) ,"broken pipe"}, | 113 | {ERR_REASON(BIO_R_CONNECT_ERROR) , "connect error"}, |
| 115 | {ERR_REASON(BIO_R_CONNECT_ERROR) ,"connect error"}, | 114 | {ERR_REASON(BIO_R_EOF_ON_MEMORY_BIO) , "EOF on memory BIO"}, |
| 116 | {ERR_REASON(BIO_R_EOF_ON_MEMORY_BIO) ,"EOF on memory BIO"}, | 115 | {ERR_REASON(BIO_R_ERROR_SETTING_NBIO) , "error setting nbio"}, |
| 117 | {ERR_REASON(BIO_R_ERROR_SETTING_NBIO) ,"error setting nbio"}, | 116 | {ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET), "error setting nbio on accepted socket"}, |
| 118 | {ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET),"error setting nbio on accepted socket"}, | 117 | {ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET), "error setting nbio on accept socket"}, |
| 119 | {ERR_REASON(BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET),"error setting nbio on accept socket"}, | 118 | {ERR_REASON(BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET), "gethostbyname addr is not af inet"}, |
| 120 | {ERR_REASON(BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET),"gethostbyname addr is not af inet"}, | 119 | {ERR_REASON(BIO_R_INVALID_ARGUMENT) , "invalid argument"}, |
| 121 | {ERR_REASON(BIO_R_INVALID_ARGUMENT) ,"invalid argument"}, | 120 | {ERR_REASON(BIO_R_INVALID_IP_ADDRESS) , "invalid ip address"}, |
| 122 | {ERR_REASON(BIO_R_INVALID_IP_ADDRESS) ,"invalid ip address"}, | 121 | {ERR_REASON(BIO_R_IN_USE) , "in use"}, |
| 123 | {ERR_REASON(BIO_R_IN_USE) ,"in use"}, | 122 | {ERR_REASON(BIO_R_KEEPALIVE) , "keepalive"}, |
| 124 | {ERR_REASON(BIO_R_KEEPALIVE) ,"keepalive"}, | 123 | {ERR_REASON(BIO_R_NBIO_CONNECT_ERROR) , "nbio connect error"}, |
| 125 | {ERR_REASON(BIO_R_NBIO_CONNECT_ERROR) ,"nbio connect error"}, | 124 | {ERR_REASON(BIO_R_NO_ACCEPT_PORT_SPECIFIED), "no accept port specified"}, |
| 126 | {ERR_REASON(BIO_R_NO_ACCEPT_PORT_SPECIFIED),"no accept port specified"}, | 125 | {ERR_REASON(BIO_R_NO_HOSTNAME_SPECIFIED) , "no hostname specified"}, |
| 127 | {ERR_REASON(BIO_R_NO_HOSTNAME_SPECIFIED) ,"no hostname specified"}, | 126 | {ERR_REASON(BIO_R_NO_PORT_DEFINED) , "no port defined"}, |
| 128 | {ERR_REASON(BIO_R_NO_PORT_DEFINED) ,"no port defined"}, | 127 | {ERR_REASON(BIO_R_NO_PORT_SPECIFIED) , "no port specified"}, |
| 129 | {ERR_REASON(BIO_R_NO_PORT_SPECIFIED) ,"no port specified"}, | 128 | {ERR_REASON(BIO_R_NO_SUCH_FILE) , "no such file"}, |
| 130 | {ERR_REASON(BIO_R_NO_SUCH_FILE) ,"no such file"}, | 129 | {ERR_REASON(BIO_R_NULL_PARAMETER) , "null parameter"}, |
| 131 | {ERR_REASON(BIO_R_NULL_PARAMETER) ,"null parameter"}, | 130 | {ERR_REASON(BIO_R_TAG_MISMATCH) , "tag mismatch"}, |
| 132 | {ERR_REASON(BIO_R_TAG_MISMATCH) ,"tag mismatch"}, | 131 | {ERR_REASON(BIO_R_UNABLE_TO_BIND_SOCKET) , "unable to bind socket"}, |
| 133 | {ERR_REASON(BIO_R_UNABLE_TO_BIND_SOCKET) ,"unable to bind socket"}, | 132 | {ERR_REASON(BIO_R_UNABLE_TO_CREATE_SOCKET), "unable to create socket"}, |
| 134 | {ERR_REASON(BIO_R_UNABLE_TO_CREATE_SOCKET),"unable to create socket"}, | 133 | {ERR_REASON(BIO_R_UNABLE_TO_LISTEN_SOCKET), "unable to listen socket"}, |
| 135 | {ERR_REASON(BIO_R_UNABLE_TO_LISTEN_SOCKET),"unable to listen socket"}, | 134 | {ERR_REASON(BIO_R_UNINITIALIZED) , "uninitialized"}, |
| 136 | {ERR_REASON(BIO_R_UNINITIALIZED) ,"uninitialized"}, | 135 | {ERR_REASON(BIO_R_UNSUPPORTED_METHOD) , "unsupported method"}, |
| 137 | {ERR_REASON(BIO_R_UNSUPPORTED_METHOD) ,"unsupported method"}, | 136 | {ERR_REASON(BIO_R_WRITE_TO_READ_ONLY_BIO), "write to read only BIO"}, |
| 138 | {ERR_REASON(BIO_R_WRITE_TO_READ_ONLY_BIO),"write to read only BIO"}, | 137 | {ERR_REASON(BIO_R_WSASTARTUP) , "WSAStartup"}, |
| 139 | {ERR_REASON(BIO_R_WSASTARTUP) ,"WSAStartup"}, | 138 | {0, NULL} |
| 140 | {0,NULL} | 139 | }; |
| 141 | }; | ||
| 142 | 140 | ||
| 143 | #endif | 141 | #endif |
| 144 | 142 | ||
| 145 | void ERR_load_BIO_strings(void) | 143 | void |
| 146 | { | 144 | ERR_load_BIO_strings(void) |
| 145 | { | ||
| 147 | #ifndef OPENSSL_NO_ERR | 146 | #ifndef OPENSSL_NO_ERR |
| 148 | 147 | if (ERR_func_error_string(BIO_str_functs[0].error) == NULL) { | |
| 149 | if (ERR_func_error_string(BIO_str_functs[0].error) == NULL) | 148 | ERR_load_strings(0, BIO_str_functs); |
| 150 | { | 149 | ERR_load_strings(0, BIO_str_reasons); |
| 151 | ERR_load_strings(0,BIO_str_functs); | ||
| 152 | ERR_load_strings(0,BIO_str_reasons); | ||
| 153 | } | ||
| 154 | #endif | ||
| 155 | } | 150 | } |
| 151 | #endif | ||
| 152 | } | ||
diff --git a/src/lib/libssl/src/crypto/bio/bio_lib.c b/src/lib/libssl/src/crypto/bio/bio_lib.c index 9c9646afa8..9e8fb7913a 100644 --- a/src/lib/libssl/src/crypto/bio/bio_lib.c +++ b/src/lib/libssl/src/crypto/bio/bio_lib.c | |||
| @@ -63,539 +63,571 @@ | |||
| 63 | #include <openssl/bio.h> | 63 | #include <openssl/bio.h> |
| 64 | #include <openssl/stack.h> | 64 | #include <openssl/stack.h> |
| 65 | 65 | ||
| 66 | BIO *BIO_new(BIO_METHOD *method) | 66 | BIO |
| 67 | { | 67 | *BIO_new(BIO_METHOD *method) |
| 68 | BIO *ret=NULL; | 68 | { |
| 69 | 69 | BIO *ret = NULL; | |
| 70 | ret=(BIO *)OPENSSL_malloc(sizeof(BIO)); | 70 | |
| 71 | if (ret == NULL) | 71 | ret = (BIO *)OPENSSL_malloc(sizeof(BIO)); |
| 72 | { | 72 | if (ret == NULL) { |
| 73 | BIOerr(BIO_F_BIO_NEW,ERR_R_MALLOC_FAILURE); | 73 | BIOerr(BIO_F_BIO_NEW, ERR_R_MALLOC_FAILURE); |
| 74 | return(NULL); | 74 | return (NULL); |
| 75 | } | 75 | } |
| 76 | if (!BIO_set(ret,method)) | 76 | if (!BIO_set(ret, method)) { |
| 77 | { | ||
| 78 | OPENSSL_free(ret); | 77 | OPENSSL_free(ret); |
| 79 | ret=NULL; | 78 | ret = NULL; |
| 80 | } | ||
| 81 | return(ret); | ||
| 82 | } | 79 | } |
| 80 | return (ret); | ||
| 81 | } | ||
| 83 | 82 | ||
| 84 | int BIO_set(BIO *bio, BIO_METHOD *method) | 83 | int |
| 85 | { | 84 | BIO_set(BIO *bio, BIO_METHOD *method) |
| 86 | bio->method=method; | 85 | { |
| 87 | bio->callback=NULL; | 86 | bio->method = method; |
| 88 | bio->cb_arg=NULL; | 87 | bio->callback = NULL; |
| 89 | bio->init=0; | 88 | bio->cb_arg = NULL; |
| 90 | bio->shutdown=1; | 89 | bio->init = 0; |
| 91 | bio->flags=0; | 90 | bio->shutdown = 1; |
| 92 | bio->retry_reason=0; | 91 | bio->flags = 0; |
| 93 | bio->num=0; | 92 | bio->retry_reason = 0; |
| 94 | bio->ptr=NULL; | 93 | bio->num = 0; |
| 95 | bio->prev_bio=NULL; | 94 | bio->ptr = NULL; |
| 96 | bio->next_bio=NULL; | 95 | bio->prev_bio = NULL; |
| 97 | bio->references=1; | 96 | bio->next_bio = NULL; |
| 98 | bio->num_read=0L; | 97 | bio->references = 1; |
| 99 | bio->num_write=0L; | 98 | bio->num_read = 0L; |
| 99 | bio->num_write = 0L; | ||
| 100 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data); | 100 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data); |
| 101 | if (method->create != NULL) | 101 | if (method->create != NULL) |
| 102 | if (!method->create(bio)) | 102 | if (!method->create(bio)) { |
| 103 | { | ||
| 104 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, | 103 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, |
| 105 | &bio->ex_data); | 104 | &bio->ex_data); |
| 106 | return(0); | 105 | return (0); |
| 107 | } | 106 | } |
| 108 | return(1); | 107 | return (1); |
| 109 | } | 108 | } |
| 110 | 109 | ||
| 111 | int BIO_free(BIO *a) | 110 | int |
| 112 | { | 111 | BIO_free(BIO *a) |
| 112 | { | ||
| 113 | int i; | 113 | int i; |
| 114 | 114 | ||
| 115 | if (a == NULL) return(0); | 115 | if (a == NULL) |
| 116 | return (0); | ||
| 116 | 117 | ||
| 117 | i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_BIO); | 118 | i = CRYPTO_add(&a->references, -1, CRYPTO_LOCK_BIO); |
| 118 | #ifdef REF_PRINT | 119 | #ifdef REF_PRINT |
| 119 | REF_PRINT("BIO",a); | 120 | REF_PRINT("BIO", a); |
| 120 | #endif | 121 | #endif |
| 121 | if (i > 0) return(1); | 122 | if (i > 0) |
| 123 | return (1); | ||
| 122 | #ifdef REF_CHECK | 124 | #ifdef REF_CHECK |
| 123 | if (i < 0) | 125 | if (i < 0) { |
| 124 | { | 126 | fprintf(stderr, "BIO_free, bad reference count\n"); |
| 125 | fprintf(stderr,"BIO_free, bad reference count\n"); | ||
| 126 | abort(); | 127 | abort(); |
| 127 | } | 128 | } |
| 128 | #endif | 129 | #endif |
| 129 | if ((a->callback != NULL) && | 130 | if ((a->callback != NULL) && |
| 130 | ((i=(int)a->callback(a,BIO_CB_FREE,NULL,0,0L,1L)) <= 0)) | 131 | ((i = (int)a->callback(a, BIO_CB_FREE, NULL, 0, 0L, 1L)) <= 0)) |
| 131 | return(i); | 132 | return (i); |
| 132 | 133 | ||
| 133 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data); | 134 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data); |
| 134 | 135 | ||
| 135 | if ((a->method == NULL) || (a->method->destroy == NULL)) return(1); | 136 | if ((a->method == NULL) || (a->method->destroy == NULL)) |
| 137 | return (1); | ||
| 136 | a->method->destroy(a); | 138 | a->method->destroy(a); |
| 137 | OPENSSL_free(a); | 139 | OPENSSL_free(a); |
| 138 | return(1); | 140 | return (1); |
| 139 | } | 141 | } |
| 140 | 142 | ||
| 141 | void BIO_vfree(BIO *a) | 143 | void |
| 142 | { BIO_free(a); } | 144 | BIO_vfree(BIO *a) |
| 145 | { | ||
| 146 | BIO_free(a); | ||
| 147 | } | ||
| 143 | 148 | ||
| 144 | void BIO_clear_flags(BIO *b, int flags) | 149 | void |
| 145 | { | 150 | BIO_clear_flags(BIO *b, int flags) |
| 151 | { | ||
| 146 | b->flags &= ~flags; | 152 | b->flags &= ~flags; |
| 147 | } | 153 | } |
| 148 | 154 | ||
| 149 | int BIO_test_flags(const BIO *b, int flags) | 155 | int |
| 150 | { | 156 | BIO_test_flags(const BIO *b, int flags) |
| 157 | { | ||
| 151 | return (b->flags & flags); | 158 | return (b->flags & flags); |
| 152 | } | 159 | } |
| 153 | 160 | ||
| 154 | void BIO_set_flags(BIO *b, int flags) | 161 | void |
| 155 | { | 162 | BIO_set_flags(BIO *b, int flags) |
| 163 | { | ||
| 156 | b->flags |= flags; | 164 | b->flags |= flags; |
| 157 | } | 165 | } |
| 158 | 166 | ||
| 159 | long (*BIO_get_callback(const BIO *b))(struct bio_st *,int,const char *,int, long,long) | 167 | long |
| 160 | { | 168 | (*BIO_get_callback(const BIO *b))(struct bio_st *, int, const char *, int, |
| 169 | long, long) | ||
| 170 | { | ||
| 161 | return b->callback; | 171 | return b->callback; |
| 162 | } | 172 | } |
| 163 | 173 | ||
| 164 | void BIO_set_callback(BIO *b, long (*cb)(struct bio_st *,int,const char *,int, long,long)) | 174 | void |
| 165 | { | 175 | BIO_set_callback(BIO *b, long (*cb)(struct bio_st *, int, const char *, int, |
| 176 | long, long)) | ||
| 177 | { | ||
| 166 | b->callback = cb; | 178 | b->callback = cb; |
| 167 | } | 179 | } |
| 168 | 180 | ||
| 169 | void BIO_set_callback_arg(BIO *b, char *arg) | 181 | void |
| 170 | { | 182 | BIO_set_callback_arg(BIO *b, char *arg) |
| 183 | { | ||
| 171 | b->cb_arg = arg; | 184 | b->cb_arg = arg; |
| 172 | } | 185 | } |
| 173 | 186 | ||
| 174 | char * BIO_get_callback_arg(const BIO *b) | 187 | char * |
| 175 | { | 188 | BIO_get_callback_arg(const BIO *b) |
| 189 | { | ||
| 176 | return b->cb_arg; | 190 | return b->cb_arg; |
| 177 | } | 191 | } |
| 178 | 192 | ||
| 179 | const char * BIO_method_name(const BIO *b) | 193 | const char * |
| 180 | { | 194 | BIO_method_name(const BIO *b) |
| 195 | { | ||
| 181 | return b->method->name; | 196 | return b->method->name; |
| 182 | } | 197 | } |
| 183 | 198 | ||
| 184 | int BIO_method_type(const BIO *b) | 199 | int |
| 185 | { | 200 | BIO_method_type(const BIO *b) |
| 201 | { | ||
| 186 | return b->method->type; | 202 | return b->method->type; |
| 187 | } | 203 | } |
| 188 | |||
| 189 | 204 | ||
| 190 | int BIO_read(BIO *b, void *out, int outl) | 205 | int |
| 191 | { | 206 | BIO_read(BIO *b, void *out, int outl) |
| 207 | { | ||
| 192 | int i; | 208 | int i; |
| 193 | long (*cb)(BIO *,int,const char *,int,long,long); | 209 | long (*cb)(BIO *, int, const char *, int, long, long); |
| 194 | 210 | ||
| 195 | if ((b == NULL) || (b->method == NULL) || (b->method->bread == NULL)) | 211 | if ((b == NULL) || (b->method == NULL) || (b->method->bread == NULL)) { |
| 196 | { | 212 | BIOerr(BIO_F_BIO_READ, BIO_R_UNSUPPORTED_METHOD); |
| 197 | BIOerr(BIO_F_BIO_READ,BIO_R_UNSUPPORTED_METHOD); | 213 | return (-2); |
| 198 | return(-2); | 214 | } |
| 199 | } | ||
| 200 | 215 | ||
| 201 | cb=b->callback; | 216 | cb = b->callback; |
| 202 | if ((cb != NULL) && | 217 | if ((cb != NULL) && |
| 203 | ((i=(int)cb(b,BIO_CB_READ,out,outl,0L,1L)) <= 0)) | 218 | ((i = (int)cb(b, BIO_CB_READ, out, outl, 0L, 1L)) <= 0)) |
| 204 | return(i); | 219 | return (i); |
| 205 | 220 | ||
| 206 | if (!b->init) | 221 | if (!b->init) { |
| 207 | { | 222 | BIOerr(BIO_F_BIO_READ, BIO_R_UNINITIALIZED); |
| 208 | BIOerr(BIO_F_BIO_READ,BIO_R_UNINITIALIZED); | 223 | return (-2); |
| 209 | return(-2); | 224 | } |
| 210 | } | ||
| 211 | 225 | ||
| 212 | i=b->method->bread(b,out,outl); | 226 | i = b->method->bread(b, out, outl); |
| 213 | 227 | ||
| 214 | if (i > 0) b->num_read+=(unsigned long)i; | 228 | if (i > 0) |
| 229 | b->num_read += (unsigned long)i; | ||
| 215 | 230 | ||
| 216 | if (cb != NULL) | 231 | if (cb != NULL) |
| 217 | i=(int)cb(b,BIO_CB_READ|BIO_CB_RETURN,out,outl, | 232 | i = (int)cb(b, BIO_CB_READ|BIO_CB_RETURN, out, outl, |
| 218 | 0L,(long)i); | 233 | 0L, (long)i); |
| 219 | return(i); | 234 | return (i); |
| 220 | } | 235 | } |
| 221 | 236 | ||
| 222 | int BIO_write(BIO *b, const void *in, int inl) | 237 | int |
| 223 | { | 238 | BIO_write(BIO *b, const void *in, int inl) |
| 239 | { | ||
| 224 | int i; | 240 | int i; |
| 225 | long (*cb)(BIO *,int,const char *,int,long,long); | 241 | long (*cb)(BIO *, int, const char *, int, long, long); |
| 226 | 242 | ||
| 227 | if (b == NULL) | 243 | if (b == NULL) |
| 228 | return(0); | 244 | return (0); |
| 229 | 245 | ||
| 230 | cb=b->callback; | 246 | cb = b->callback; |
| 231 | if ((b->method == NULL) || (b->method->bwrite == NULL)) | 247 | if ((b->method == NULL) || (b->method->bwrite == NULL)) { |
| 232 | { | 248 | BIOerr(BIO_F_BIO_WRITE, BIO_R_UNSUPPORTED_METHOD); |
| 233 | BIOerr(BIO_F_BIO_WRITE,BIO_R_UNSUPPORTED_METHOD); | 249 | return (-2); |
| 234 | return(-2); | 250 | } |
| 235 | } | ||
| 236 | 251 | ||
| 237 | if ((cb != NULL) && | 252 | if ((cb != NULL) && |
| 238 | ((i=(int)cb(b,BIO_CB_WRITE,in,inl,0L,1L)) <= 0)) | 253 | ((i = (int)cb(b, BIO_CB_WRITE, in, inl, 0L, 1L)) <= 0)) |
| 239 | return(i); | 254 | return (i); |
| 240 | 255 | ||
| 241 | if (!b->init) | 256 | if (!b->init) { |
| 242 | { | 257 | BIOerr(BIO_F_BIO_WRITE, BIO_R_UNINITIALIZED); |
| 243 | BIOerr(BIO_F_BIO_WRITE,BIO_R_UNINITIALIZED); | 258 | return (-2); |
| 244 | return(-2); | 259 | } |
| 245 | } | ||
| 246 | 260 | ||
| 247 | i=b->method->bwrite(b,in,inl); | 261 | i = b->method->bwrite(b, in, inl); |
| 248 | 262 | ||
| 249 | if (i > 0) b->num_write+=(unsigned long)i; | 263 | if (i > 0) |
| 264 | b->num_write += (unsigned long)i; | ||
| 250 | 265 | ||
| 251 | if (cb != NULL) | 266 | if (cb != NULL) |
| 252 | i=(int)cb(b,BIO_CB_WRITE|BIO_CB_RETURN,in,inl, | 267 | i = (int)cb(b, BIO_CB_WRITE|BIO_CB_RETURN, in, inl, |
| 253 | 0L,(long)i); | 268 | 0L, (long)i); |
| 254 | return(i); | 269 | return (i); |
| 255 | } | 270 | } |
| 256 | 271 | ||
| 257 | int BIO_puts(BIO *b, const char *in) | 272 | int |
| 258 | { | 273 | BIO_puts(BIO *b, const char *in) |
| 274 | { | ||
| 259 | int i; | 275 | int i; |
| 260 | long (*cb)(BIO *,int,const char *,int,long,long); | 276 | long (*cb)(BIO *, int, const char *, int, long, long); |
| 261 | 277 | ||
| 262 | if ((b == NULL) || (b->method == NULL) || (b->method->bputs == NULL)) | 278 | if ((b == NULL) || (b->method == NULL) || (b->method->bputs == NULL)) { |
| 263 | { | 279 | BIOerr(BIO_F_BIO_PUTS, BIO_R_UNSUPPORTED_METHOD); |
| 264 | BIOerr(BIO_F_BIO_PUTS,BIO_R_UNSUPPORTED_METHOD); | 280 | return (-2); |
| 265 | return(-2); | 281 | } |
| 266 | } | ||
| 267 | 282 | ||
| 268 | cb=b->callback; | 283 | cb = b->callback; |
| 269 | 284 | ||
| 270 | if ((cb != NULL) && | 285 | if ((cb != NULL) && |
| 271 | ((i=(int)cb(b,BIO_CB_PUTS,in,0,0L,1L)) <= 0)) | 286 | ((i = (int)cb(b, BIO_CB_PUTS, in, 0, 0L, 1L)) <= 0)) |
| 272 | return(i); | 287 | return (i); |
| 273 | 288 | ||
| 274 | if (!b->init) | 289 | if (!b->init) { |
| 275 | { | 290 | BIOerr(BIO_F_BIO_PUTS, BIO_R_UNINITIALIZED); |
| 276 | BIOerr(BIO_F_BIO_PUTS,BIO_R_UNINITIALIZED); | 291 | return (-2); |
| 277 | return(-2); | 292 | } |
| 278 | } | ||
| 279 | 293 | ||
| 280 | i=b->method->bputs(b,in); | 294 | i = b->method->bputs(b, in); |
| 281 | 295 | ||
| 282 | if (i > 0) b->num_write+=(unsigned long)i; | 296 | if (i > 0) |
| 297 | b->num_write += (unsigned long)i; | ||
| 283 | 298 | ||
| 284 | if (cb != NULL) | 299 | if (cb != NULL) |
| 285 | i=(int)cb(b,BIO_CB_PUTS|BIO_CB_RETURN,in,0, | 300 | i = (int)cb(b, BIO_CB_PUTS|BIO_CB_RETURN, in, 0, 0L, (long)i); |
| 286 | 0L,(long)i); | 301 | return (i); |
| 287 | return(i); | 302 | } |
| 288 | } | ||
| 289 | 303 | ||
| 290 | int BIO_gets(BIO *b, char *in, int inl) | 304 | int |
| 291 | { | 305 | BIO_gets(BIO *b, char *in, int inl) |
| 306 | { | ||
| 292 | int i; | 307 | int i; |
| 293 | long (*cb)(BIO *,int,const char *,int,long,long); | 308 | long (*cb)(BIO *, int, const char *, int, long, long); |
| 294 | 309 | ||
| 295 | if ((b == NULL) || (b->method == NULL) || (b->method->bgets == NULL)) | 310 | if ((b == NULL) || (b->method == NULL) || (b->method->bgets == NULL)) { |
| 296 | { | 311 | BIOerr(BIO_F_BIO_GETS, BIO_R_UNSUPPORTED_METHOD); |
| 297 | BIOerr(BIO_F_BIO_GETS,BIO_R_UNSUPPORTED_METHOD); | 312 | return (-2); |
| 298 | return(-2); | 313 | } |
| 299 | } | ||
| 300 | 314 | ||
| 301 | cb=b->callback; | 315 | cb = b->callback; |
| 302 | 316 | ||
| 303 | if ((cb != NULL) && | 317 | if ((cb != NULL) && |
| 304 | ((i=(int)cb(b,BIO_CB_GETS,in,inl,0L,1L)) <= 0)) | 318 | ((i = (int)cb(b, BIO_CB_GETS, in, inl, 0L, 1L)) <= 0)) |
| 305 | return(i); | 319 | return (i); |
| 306 | 320 | ||
| 307 | if (!b->init) | 321 | if (!b->init) { |
| 308 | { | 322 | BIOerr(BIO_F_BIO_GETS, BIO_R_UNINITIALIZED); |
| 309 | BIOerr(BIO_F_BIO_GETS,BIO_R_UNINITIALIZED); | 323 | return (-2); |
| 310 | return(-2); | 324 | } |
| 311 | } | ||
| 312 | 325 | ||
| 313 | i=b->method->bgets(b,in,inl); | 326 | i = b->method->bgets(b, in, inl); |
| 314 | 327 | ||
| 315 | if (cb != NULL) | 328 | if (cb != NULL) |
| 316 | i=(int)cb(b,BIO_CB_GETS|BIO_CB_RETURN,in,inl, | 329 | i = (int)cb(b, BIO_CB_GETS|BIO_CB_RETURN, in, inl, 0L, (long)i); |
| 317 | 0L,(long)i); | 330 | return (i); |
| 318 | return(i); | 331 | } |
| 319 | } | ||
| 320 | 332 | ||
| 321 | int BIO_indent(BIO *b,int indent,int max) | 333 | int |
| 322 | { | 334 | BIO_indent(BIO *b, int indent, int max) |
| 323 | if(indent < 0) | 335 | { |
| 324 | indent=0; | 336 | if (indent < 0) |
| 325 | if(indent > max) | 337 | indent = 0; |
| 326 | indent=max; | 338 | if (indent > max) |
| 327 | while(indent--) | 339 | indent = max; |
| 328 | if(BIO_puts(b," ") != 1) | 340 | while (indent--) |
| 329 | return 0; | 341 | if (BIO_puts(b, " ") != 1) |
| 342 | return 0; | ||
| 330 | return 1; | 343 | return 1; |
| 331 | } | 344 | } |
| 332 | 345 | ||
| 333 | long BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg) | 346 | long |
| 334 | { | 347 | BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg) |
| 348 | { | ||
| 335 | int i; | 349 | int i; |
| 336 | 350 | ||
| 337 | i=iarg; | 351 | i = iarg; |
| 338 | return(BIO_ctrl(b,cmd,larg,(char *)&i)); | 352 | return (BIO_ctrl(b, cmd, larg,(char *)&i)); |
| 339 | } | 353 | } |
| 340 | 354 | ||
| 341 | char *BIO_ptr_ctrl(BIO *b, int cmd, long larg) | 355 | char |
| 342 | { | 356 | *BIO_ptr_ctrl(BIO *b, int cmd, long larg) |
| 343 | char *p=NULL; | 357 | { |
| 358 | char *p = NULL; | ||
| 344 | 359 | ||
| 345 | if (BIO_ctrl(b,cmd,larg,(char *)&p) <= 0) | 360 | if (BIO_ctrl(b, cmd, larg,(char *)&p) <= 0) |
| 346 | return(NULL); | 361 | return (NULL); |
| 347 | else | 362 | else |
| 348 | return(p); | 363 | return (p); |
| 349 | } | 364 | } |
| 350 | 365 | ||
| 351 | long BIO_ctrl(BIO *b, int cmd, long larg, void *parg) | 366 | long |
| 352 | { | 367 | BIO_ctrl(BIO *b, int cmd, long larg, void *parg) |
| 368 | { | ||
| 353 | long ret; | 369 | long ret; |
| 354 | long (*cb)(BIO *,int,const char *,int,long,long); | 370 | long (*cb)(BIO *, int, const char *, int, long, long); |
| 355 | 371 | ||
| 356 | if (b == NULL) return(0); | 372 | if (b == NULL) |
| 373 | return (0); | ||
| 357 | 374 | ||
| 358 | if ((b->method == NULL) || (b->method->ctrl == NULL)) | 375 | if ((b->method == NULL) || (b->method->ctrl == NULL)) { |
| 359 | { | 376 | BIOerr(BIO_F_BIO_CTRL, BIO_R_UNSUPPORTED_METHOD); |
| 360 | BIOerr(BIO_F_BIO_CTRL,BIO_R_UNSUPPORTED_METHOD); | 377 | return (-2); |
| 361 | return(-2); | 378 | } |
| 362 | } | ||
| 363 | 379 | ||
| 364 | cb=b->callback; | 380 | cb = b->callback; |
| 365 | 381 | ||
| 366 | if ((cb != NULL) && | 382 | if ((cb != NULL) && |
| 367 | ((ret=cb(b,BIO_CB_CTRL,parg,cmd,larg,1L)) <= 0)) | 383 | ((ret = cb(b, BIO_CB_CTRL, parg, cmd, larg, 1L)) <= 0)) |
| 368 | return(ret); | 384 | return (ret); |
| 369 | 385 | ||
| 370 | ret=b->method->ctrl(b,cmd,larg,parg); | 386 | ret = b->method->ctrl(b, cmd, larg, parg); |
| 371 | 387 | ||
| 372 | if (cb != NULL) | 388 | if (cb != NULL) |
| 373 | ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,parg,cmd, | 389 | ret = cb(b, BIO_CB_CTRL|BIO_CB_RETURN, parg, cmd, larg, ret); |
| 374 | larg,ret); | 390 | return (ret); |
| 375 | return(ret); | 391 | } |
| 376 | } | ||
| 377 | 392 | ||
| 378 | long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long)) | 393 | long |
| 379 | { | 394 | BIO_callback_ctrl(BIO *b, int cmd, |
| 395 | void (*fp)(struct bio_st *, int, const char *, int, long, long)) | ||
| 396 | { | ||
| 380 | long ret; | 397 | long ret; |
| 381 | long (*cb)(BIO *,int,const char *,int,long,long); | 398 | long (*cb)(BIO *, int, const char *, int, long, long); |
| 382 | 399 | ||
| 383 | if (b == NULL) return(0); | 400 | if (b == NULL) |
| 401 | return (0); | ||
| 384 | 402 | ||
| 385 | if ((b->method == NULL) || (b->method->callback_ctrl == NULL)) | 403 | if ((b->method == NULL) || (b->method->callback_ctrl == NULL)) { |
| 386 | { | 404 | BIOerr(BIO_F_BIO_CALLBACK_CTRL, BIO_R_UNSUPPORTED_METHOD); |
| 387 | BIOerr(BIO_F_BIO_CALLBACK_CTRL,BIO_R_UNSUPPORTED_METHOD); | 405 | return (-2); |
| 388 | return(-2); | 406 | } |
| 389 | } | ||
| 390 | 407 | ||
| 391 | cb=b->callback; | 408 | cb = b->callback; |
| 392 | 409 | ||
| 393 | if ((cb != NULL) && | 410 | if ((cb != NULL) && |
| 394 | ((ret=cb(b,BIO_CB_CTRL,(void *)&fp,cmd,0,1L)) <= 0)) | 411 | ((ret = cb(b, BIO_CB_CTRL,(void *)&fp, cmd, 0, 1L)) <= 0)) |
| 395 | return(ret); | 412 | return (ret); |
| 396 | 413 | ||
| 397 | ret=b->method->callback_ctrl(b,cmd,fp); | 414 | ret = b->method->callback_ctrl(b, cmd, fp); |
| 398 | 415 | ||
| 399 | if (cb != NULL) | 416 | if (cb != NULL) |
| 400 | ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp,cmd, | 417 | ret = cb(b, BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp, cmd, 0, ret); |
| 401 | 0,ret); | 418 | return (ret); |
| 402 | return(ret); | 419 | } |
| 403 | } | ||
| 404 | 420 | ||
| 405 | /* It is unfortunate to duplicate in functions what the BIO_(w)pending macros | 421 | /* It is unfortunate to duplicate in functions what the BIO_(w)pending macros |
| 406 | * do; but those macros have inappropriate return type, and for interfacing | 422 | * do; but those macros have inappropriate return type, and for interfacing |
| 407 | * from other programming languages, C macros aren't much of a help anyway. */ | 423 | * from other programming languages, C macros aren't much of a help anyway. */ |
| 408 | size_t BIO_ctrl_pending(BIO *bio) | 424 | size_t |
| 409 | { | 425 | BIO_ctrl_pending(BIO *bio) |
| 426 | { | ||
| 410 | return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL); | 427 | return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL); |
| 411 | } | 428 | } |
| 412 | 429 | ||
| 413 | size_t BIO_ctrl_wpending(BIO *bio) | 430 | size_t |
| 414 | { | 431 | BIO_ctrl_wpending(BIO *bio) |
| 432 | { | ||
| 415 | return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL); | 433 | return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL); |
| 416 | } | 434 | } |
| 417 | 435 | ||
| 418 | 436 | ||
| 419 | /* put the 'bio' on the end of b's list of operators */ | 437 | /* put the 'bio' on the end of b's list of operators */ |
| 420 | BIO *BIO_push(BIO *b, BIO *bio) | 438 | BIO |
| 421 | { | 439 | *BIO_push(BIO *b, BIO *bio) |
| 440 | { | ||
| 422 | BIO *lb; | 441 | BIO *lb; |
| 423 | 442 | ||
| 424 | if (b == NULL) return(bio); | 443 | if (b == NULL) |
| 425 | lb=b; | 444 | return (bio); |
| 445 | lb = b; | ||
| 426 | while (lb->next_bio != NULL) | 446 | while (lb->next_bio != NULL) |
| 427 | lb=lb->next_bio; | 447 | lb = lb->next_bio; |
| 428 | lb->next_bio=bio; | 448 | lb->next_bio = bio; |
| 429 | if (bio != NULL) | 449 | if (bio != NULL) |
| 430 | bio->prev_bio=lb; | 450 | bio->prev_bio = lb; |
| 431 | /* called to do internal processing */ | 451 | /* called to do internal processing */ |
| 432 | BIO_ctrl(b,BIO_CTRL_PUSH,0,lb); | 452 | BIO_ctrl(b, BIO_CTRL_PUSH, 0, lb); |
| 433 | return(b); | 453 | return (b); |
| 434 | } | 454 | } |
| 435 | 455 | ||
| 436 | /* Remove the first and return the rest */ | 456 | /* Remove the first and return the rest */ |
| 437 | BIO *BIO_pop(BIO *b) | 457 | BIO |
| 438 | { | 458 | *BIO_pop(BIO *b) |
| 459 | { | ||
| 439 | BIO *ret; | 460 | BIO *ret; |
| 440 | 461 | ||
| 441 | if (b == NULL) return(NULL); | 462 | if (b == NULL) |
| 442 | ret=b->next_bio; | 463 | return (NULL); |
| 464 | ret = b->next_bio; | ||
| 443 | 465 | ||
| 444 | BIO_ctrl(b,BIO_CTRL_POP,0,b); | 466 | BIO_ctrl(b, BIO_CTRL_POP, 0, b); |
| 445 | 467 | ||
| 446 | if (b->prev_bio != NULL) | 468 | if (b->prev_bio != NULL) |
| 447 | b->prev_bio->next_bio=b->next_bio; | 469 | b->prev_bio->next_bio = b->next_bio; |
| 448 | if (b->next_bio != NULL) | 470 | if (b->next_bio != NULL) |
| 449 | b->next_bio->prev_bio=b->prev_bio; | 471 | b->next_bio->prev_bio = b->prev_bio; |
| 450 | 472 | ||
| 451 | b->next_bio=NULL; | 473 | b->next_bio = NULL; |
| 452 | b->prev_bio=NULL; | 474 | b->prev_bio = NULL; |
| 453 | return(ret); | 475 | return (ret); |
| 454 | } | 476 | } |
| 455 | 477 | ||
| 456 | BIO *BIO_get_retry_BIO(BIO *bio, int *reason) | 478 | BIO |
| 457 | { | 479 | *BIO_get_retry_BIO(BIO *bio, int *reason) |
| 458 | BIO *b,*last; | 480 | { |
| 481 | BIO *b, *last; | ||
| 459 | 482 | ||
| 460 | b=last=bio; | 483 | b = last = bio; |
| 461 | for (;;) | 484 | for (;;) { |
| 462 | { | ||
| 463 | if (!BIO_should_retry(b)) break; | 485 | if (!BIO_should_retry(b)) break; |
| 464 | last=b; | 486 | last = b; |
| 465 | b=b->next_bio; | 487 | b = b->next_bio; |
| 466 | if (b == NULL) break; | 488 | if (b == NULL) |
| 467 | } | 489 | break; |
| 468 | if (reason != NULL) *reason=last->retry_reason; | 490 | } |
| 469 | return(last); | 491 | if (reason != NULL) |
| 470 | } | 492 | *reason = last->retry_reason; |
| 493 | return (last); | ||
| 494 | } | ||
| 471 | 495 | ||
| 472 | int BIO_get_retry_reason(BIO *bio) | 496 | int |
| 473 | { | 497 | BIO_get_retry_reason(BIO *bio) |
| 474 | return(bio->retry_reason); | 498 | { |
| 475 | } | 499 | return (bio->retry_reason); |
| 500 | } | ||
| 476 | 501 | ||
| 477 | BIO *BIO_find_type(BIO *bio, int type) | 502 | BIO |
| 478 | { | 503 | *BIO_find_type(BIO *bio, int type) |
| 479 | int mt,mask; | 504 | { |
| 480 | 505 | int mt, mask; | |
| 481 | if(!bio) return NULL; | 506 | |
| 482 | mask=type&0xff; | 507 | if (!bio) |
| 483 | do { | 508 | return NULL; |
| 484 | if (bio->method != NULL) | 509 | mask = type & 0xff; |
| 485 | { | 510 | do { |
| 486 | mt=bio->method->type; | 511 | if (bio->method != NULL) { |
| 487 | 512 | mt = bio->method->type; | |
| 488 | if (!mask) | 513 | if (!mask) { |
| 489 | { | 514 | if (mt & type) |
| 490 | if (mt & type) return(bio); | 515 | return (bio); |
| 491 | } | 516 | } else if (mt == type) |
| 492 | else if (mt == type) | 517 | return (bio); |
| 493 | return(bio); | 518 | } |
| 494 | } | 519 | bio = bio->next_bio; |
| 495 | bio=bio->next_bio; | 520 | } while (bio != NULL); |
| 496 | } while (bio != NULL); | 521 | return (NULL); |
| 497 | return(NULL); | 522 | } |
| 498 | } | ||
| 499 | 523 | ||
| 500 | BIO *BIO_next(BIO *b) | 524 | BIO |
| 501 | { | 525 | *BIO_next(BIO *b) |
| 502 | if(!b) return NULL; | 526 | { |
| 527 | if (!b) | ||
| 528 | return NULL; | ||
| 503 | return b->next_bio; | 529 | return b->next_bio; |
| 504 | } | 530 | } |
| 505 | 531 | ||
| 506 | void BIO_free_all(BIO *bio) | 532 | void |
| 507 | { | 533 | BIO_free_all(BIO *bio) |
| 534 | { | ||
| 508 | BIO *b; | 535 | BIO *b; |
| 509 | int ref; | 536 | int ref; |
| 510 | 537 | ||
| 511 | while (bio != NULL) | 538 | while (bio != NULL) { |
| 512 | { | 539 | b = bio; |
| 513 | b=bio; | 540 | ref = b->references; |
| 514 | ref=b->references; | 541 | bio = bio->next_bio; |
| 515 | bio=bio->next_bio; | ||
| 516 | BIO_free(b); | 542 | BIO_free(b); |
| 517 | /* Since ref count > 1, don't free anyone else. */ | 543 | /* Since ref count > 1, don't free anyone else. */ |
| 518 | if (ref > 1) break; | 544 | if (ref > 1) |
| 519 | } | 545 | break; |
| 520 | } | 546 | } |
| 547 | } | ||
| 521 | 548 | ||
| 522 | BIO *BIO_dup_chain(BIO *in) | 549 | BIO |
| 523 | { | 550 | *BIO_dup_chain(BIO *in) |
| 524 | BIO *ret=NULL,*eoc=NULL,*bio,*new_bio; | 551 | { |
| 552 | BIO *ret = NULL, *eoc = NULL, *bio, *new_bio; | ||
| 525 | 553 | ||
| 526 | for (bio=in; bio != NULL; bio=bio->next_bio) | 554 | for (bio = in; bio != NULL; bio = bio->next_bio) { |
| 527 | { | 555 | if ((new_bio = BIO_new(bio->method)) == NULL) goto err; |
| 528 | if ((new_bio=BIO_new(bio->method)) == NULL) goto err; | 556 | new_bio->callback = bio->callback; |
| 529 | new_bio->callback=bio->callback; | 557 | new_bio->cb_arg = bio->cb_arg; |
| 530 | new_bio->cb_arg=bio->cb_arg; | 558 | new_bio->init = bio->init; |
| 531 | new_bio->init=bio->init; | 559 | new_bio->shutdown = bio->shutdown; |
| 532 | new_bio->shutdown=bio->shutdown; | 560 | new_bio->flags = bio->flags; |
| 533 | new_bio->flags=bio->flags; | ||
| 534 | 561 | ||
| 535 | /* This will let SSL_s_sock() work with stdin/stdout */ | 562 | /* This will let SSL_s_sock() work with stdin/stdout */ |
| 536 | new_bio->num=bio->num; | 563 | new_bio->num = bio->num; |
| 537 | 564 | ||
| 538 | if (!BIO_dup_state(bio,(char *)new_bio)) | 565 | if (!BIO_dup_state(bio,(char *)new_bio)) { |
| 539 | { | ||
| 540 | BIO_free(new_bio); | 566 | BIO_free(new_bio); |
| 541 | goto err; | 567 | goto err; |
| 542 | } | 568 | } |
| 543 | 569 | ||
| 544 | /* copy app data */ | 570 | /* copy app data */ |
| 545 | if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO, &new_bio->ex_data, | 571 | if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO, |
| 546 | &bio->ex_data)) | 572 | &new_bio->ex_data, &bio->ex_data)) |
| 547 | goto err; | 573 | goto err; |
| 548 | 574 | ||
| 549 | if (ret == NULL) | 575 | if (ret == NULL) { |
| 550 | { | 576 | eoc = new_bio; |
| 551 | eoc=new_bio; | 577 | ret = eoc; |
| 552 | ret=eoc; | 578 | } else { |
| 553 | } | 579 | BIO_push(eoc, new_bio); |
| 554 | else | 580 | eoc = new_bio; |
| 555 | { | ||
| 556 | BIO_push(eoc,new_bio); | ||
| 557 | eoc=new_bio; | ||
| 558 | } | ||
| 559 | } | 581 | } |
| 560 | return(ret); | 582 | } |
| 583 | return (ret); | ||
| 561 | err: | 584 | err: |
| 562 | if (ret != NULL) | 585 | if (ret != NULL) |
| 563 | BIO_free(ret); | 586 | BIO_free(ret); |
| 564 | return(NULL); | 587 | return (NULL); |
| 565 | } | ||
| 566 | 588 | ||
| 567 | void BIO_copy_next_retry(BIO *b) | 589 | } |
| 568 | { | ||
| 569 | BIO_set_flags(b,BIO_get_retry_flags(b->next_bio)); | ||
| 570 | b->retry_reason=b->next_bio->retry_reason; | ||
| 571 | } | ||
| 572 | 590 | ||
| 573 | int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | 591 | void |
| 574 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) | 592 | BIO_copy_next_retry(BIO *b) |
| 575 | { | 593 | { |
| 594 | BIO_set_flags(b, BIO_get_retry_flags(b->next_bio)); | ||
| 595 | b->retry_reason = b->next_bio->retry_reason; | ||
| 596 | } | ||
| 597 | |||
| 598 | int | ||
| 599 | BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | ||
| 600 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) | ||
| 601 | { | ||
| 576 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, argl, argp, | 602 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, argl, argp, |
| 577 | new_func, dup_func, free_func); | 603 | new_func, dup_func, free_func); |
| 578 | } | 604 | } |
| 579 | 605 | ||
| 580 | int BIO_set_ex_data(BIO *bio, int idx, void *data) | 606 | int |
| 581 | { | 607 | BIO_set_ex_data(BIO *bio, int idx, void *data) |
| 582 | return(CRYPTO_set_ex_data(&(bio->ex_data),idx,data)); | 608 | { |
| 583 | } | 609 | return (CRYPTO_set_ex_data(&(bio->ex_data), idx, data)); |
| 610 | } | ||
| 584 | 611 | ||
| 585 | void *BIO_get_ex_data(BIO *bio, int idx) | 612 | void |
| 586 | { | 613 | *BIO_get_ex_data(BIO *bio, int idx) |
| 587 | return(CRYPTO_get_ex_data(&(bio->ex_data),idx)); | 614 | { |
| 588 | } | 615 | return (CRYPTO_get_ex_data(&(bio->ex_data), idx)); |
| 616 | } | ||
| 589 | 617 | ||
| 590 | unsigned long BIO_number_read(BIO *bio) | 618 | unsigned long |
| 619 | BIO_number_read(BIO *bio) | ||
| 591 | { | 620 | { |
| 592 | if(bio) return bio->num_read; | 621 | if (bio) |
| 622 | return bio->num_read; | ||
| 593 | return 0; | 623 | return 0; |
| 594 | } | 624 | } |
| 595 | 625 | ||
| 596 | unsigned long BIO_number_written(BIO *bio) | 626 | unsigned long |
| 627 | BIO_number_written(BIO *bio) | ||
| 597 | { | 628 | { |
| 598 | if(bio) return bio->num_write; | 629 | if (bio) |
| 630 | return bio->num_write; | ||
| 599 | return 0; | 631 | return 0; |
| 600 | } | 632 | } |
| 601 | 633 | ||
diff --git a/src/lib/libssl/src/crypto/bio/bss_acpt.c b/src/lib/libssl/src/crypto/bio/bss_acpt.c index 04bfb6fb9d..d772515d64 100644 --- a/src/lib/libssl/src/crypto/bio/bss_acpt.c +++ b/src/lib/libssl/src/crypto/bio/bss_acpt.c | |||
| @@ -75,8 +75,7 @@ | |||
| 75 | #undef FIONBIO | 75 | #undef FIONBIO |
| 76 | #endif | 76 | #endif |
| 77 | 77 | ||
| 78 | typedef struct bio_accept_st | 78 | typedef struct bio_accept_st { |
| 79 | { | ||
| 80 | int state; | 79 | int state; |
| 81 | char *param_addr; | 80 | char *param_addr; |
| 82 | 81 | ||
| @@ -90,7 +89,7 @@ typedef struct bio_accept_st | |||
| 90 | * If 2, always use SO_REUSEADDR. */ | 89 | * If 2, always use SO_REUSEADDR. */ |
| 91 | int bind_mode; | 90 | int bind_mode; |
| 92 | BIO *bio_chain; | 91 | BIO *bio_chain; |
| 93 | } BIO_ACCEPT; | 92 | } BIO_ACCEPT; |
| 94 | 93 | ||
| 95 | static int acpt_write(BIO *h, const char *buf, int num); | 94 | static int acpt_write(BIO *h, const char *buf, int num); |
| 96 | static int acpt_read(BIO *h, char *buf, int size); | 95 | static int acpt_read(BIO *h, char *buf, int size); |
| @@ -107,8 +106,7 @@ static void BIO_ACCEPT_free(BIO_ACCEPT *a); | |||
| 107 | #define ACPT_S_GET_ACCEPT_SOCKET 2 | 106 | #define ACPT_S_GET_ACCEPT_SOCKET 2 |
| 108 | #define ACPT_S_OK 3 | 107 | #define ACPT_S_OK 3 |
| 109 | 108 | ||
| 110 | static BIO_METHOD methods_acceptp= | 109 | static BIO_METHOD methods_acceptp = { |
| 111 | { | ||
| 112 | BIO_TYPE_ACCEPT, | 110 | BIO_TYPE_ACCEPT, |
| 113 | "socket accept", | 111 | "socket accept", |
| 114 | acpt_write, | 112 | acpt_write, |
| @@ -119,321 +117,313 @@ static BIO_METHOD methods_acceptp= | |||
| 119 | acpt_new, | 117 | acpt_new, |
| 120 | acpt_free, | 118 | acpt_free, |
| 121 | NULL, | 119 | NULL, |
| 122 | }; | 120 | }; |
| 123 | 121 | ||
| 124 | BIO_METHOD *BIO_s_accept(void) | 122 | BIO_METHOD |
| 125 | { | 123 | *BIO_s_accept(void) |
| 126 | return(&methods_acceptp); | 124 | { |
| 127 | } | 125 | return (&methods_acceptp); |
| 126 | } | ||
| 128 | 127 | ||
| 129 | static int acpt_new(BIO *bi) | 128 | static int |
| 130 | { | 129 | acpt_new(BIO *bi) |
| 130 | { | ||
| 131 | BIO_ACCEPT *ba; | 131 | BIO_ACCEPT *ba; |
| 132 | 132 | ||
| 133 | bi->init=0; | 133 | bi->init = 0; |
| 134 | bi->num=-1; | 134 | bi->num = -1; |
| 135 | bi->flags=0; | 135 | bi->flags = 0; |
| 136 | if ((ba=BIO_ACCEPT_new()) == NULL) | 136 | if ((ba = BIO_ACCEPT_new()) == NULL) |
| 137 | return(0); | 137 | return (0); |
| 138 | bi->ptr=(char *)ba; | 138 | bi->ptr = (char *)ba; |
| 139 | ba->state=ACPT_S_BEFORE; | 139 | ba->state = ACPT_S_BEFORE; |
| 140 | bi->shutdown=1; | 140 | bi->shutdown = 1; |
| 141 | return(1); | 141 | return (1); |
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | static BIO_ACCEPT *BIO_ACCEPT_new(void) | 144 | static BIO_ACCEPT |
| 145 | { | 145 | *BIO_ACCEPT_new(void) |
| 146 | { | ||
| 146 | BIO_ACCEPT *ret; | 147 | BIO_ACCEPT *ret; |
| 147 | 148 | ||
| 148 | if ((ret=(BIO_ACCEPT *)OPENSSL_malloc(sizeof(BIO_ACCEPT))) == NULL) | 149 | if ((ret = (BIO_ACCEPT *)OPENSSL_malloc(sizeof(BIO_ACCEPT))) == NULL) |
| 149 | return(NULL); | 150 | return (NULL); |
| 150 | 151 | ||
| 151 | memset(ret,0,sizeof(BIO_ACCEPT)); | 152 | memset(ret, 0, sizeof(BIO_ACCEPT)); |
| 152 | ret->accept_sock=-1; | 153 | ret->accept_sock = -1; |
| 153 | ret->bind_mode=BIO_BIND_NORMAL; | 154 | ret->bind_mode = BIO_BIND_NORMAL; |
| 154 | return(ret); | 155 | return (ret); |
| 155 | } | 156 | } |
| 156 | 157 | ||
| 157 | static void BIO_ACCEPT_free(BIO_ACCEPT *a) | 158 | static void |
| 158 | { | 159 | BIO_ACCEPT_free(BIO_ACCEPT *a) |
| 159 | if(a == NULL) | 160 | { |
| 160 | return; | 161 | if (a == NULL) |
| 161 | 162 | return; | |
| 162 | if (a->param_addr != NULL) OPENSSL_free(a->param_addr); | 163 | |
| 163 | if (a->addr != NULL) OPENSSL_free(a->addr); | 164 | if (a->param_addr != NULL) |
| 164 | if (a->bio_chain != NULL) BIO_free(a->bio_chain); | 165 | OPENSSL_free(a->param_addr); |
| 166 | if (a->addr != NULL) | ||
| 167 | OPENSSL_free(a->addr); | ||
| 168 | if (a->bio_chain != NULL) | ||
| 169 | BIO_free(a->bio_chain); | ||
| 165 | OPENSSL_free(a); | 170 | OPENSSL_free(a); |
| 166 | } | 171 | } |
| 167 | 172 | ||
| 168 | static void acpt_close_socket(BIO *bio) | 173 | static void |
| 169 | { | 174 | acpt_close_socket(BIO *bio) |
| 175 | { | ||
| 170 | BIO_ACCEPT *c; | 176 | BIO_ACCEPT *c; |
| 171 | 177 | ||
| 172 | c=(BIO_ACCEPT *)bio->ptr; | 178 | c = (BIO_ACCEPT *)bio->ptr; |
| 173 | if (c->accept_sock != -1) | 179 | if (c->accept_sock != -1) { |
| 174 | { | ||
| 175 | shutdown(c->accept_sock, SHUT_RDWR); | 180 | shutdown(c->accept_sock, SHUT_RDWR); |
| 176 | close(c->accept_sock); | 181 | close(c->accept_sock); |
| 177 | c->accept_sock=-1; | 182 | c->accept_sock = -1; |
| 178 | bio->num=-1; | 183 | bio->num = -1; |
| 179 | } | ||
| 180 | } | 184 | } |
| 185 | } | ||
| 181 | 186 | ||
| 182 | static int acpt_free(BIO *a) | 187 | static int |
| 183 | { | 188 | acpt_free(BIO *a) |
| 189 | { | ||
| 184 | BIO_ACCEPT *data; | 190 | BIO_ACCEPT *data; |
| 185 | 191 | ||
| 186 | if (a == NULL) return(0); | 192 | if (a == NULL) |
| 187 | data=(BIO_ACCEPT *)a->ptr; | 193 | return (0); |
| 188 | 194 | data = (BIO_ACCEPT *)a->ptr; | |
| 189 | if (a->shutdown) | 195 | |
| 190 | { | 196 | if (a->shutdown) { |
| 191 | acpt_close_socket(a); | 197 | acpt_close_socket(a); |
| 192 | BIO_ACCEPT_free(data); | 198 | BIO_ACCEPT_free(data); |
| 193 | a->ptr=NULL; | 199 | a->ptr = NULL; |
| 194 | a->flags=0; | 200 | a->flags = 0; |
| 195 | a->init=0; | 201 | a->init = 0; |
| 196 | } | ||
| 197 | return(1); | ||
| 198 | } | 202 | } |
| 199 | 203 | return (1); | |
| 200 | static int acpt_state(BIO *b, BIO_ACCEPT *c) | 204 | } |
| 201 | { | 205 | |
| 202 | BIO *bio=NULL,*dbio; | 206 | static int |
| 203 | int s= -1; | 207 | acpt_state(BIO *b, BIO_ACCEPT *c) |
| 208 | { | ||
| 209 | BIO *bio = NULL, *dbio; | ||
| 210 | int s = -1; | ||
| 204 | int i; | 211 | int i; |
| 205 | 212 | ||
| 206 | again: | 213 | again: |
| 207 | switch (c->state) | 214 | switch (c->state) { |
| 208 | { | ||
| 209 | case ACPT_S_BEFORE: | 215 | case ACPT_S_BEFORE: |
| 210 | if (c->param_addr == NULL) | 216 | if (c->param_addr == NULL) { |
| 211 | { | 217 | BIOerr(BIO_F_ACPT_STATE, BIO_R_NO_ACCEPT_PORT_SPECIFIED); |
| 212 | BIOerr(BIO_F_ACPT_STATE,BIO_R_NO_ACCEPT_PORT_SPECIFIED); | 218 | return (-1); |
| 213 | return(-1); | 219 | } |
| 214 | } | 220 | s = BIO_get_accept_socket(c->param_addr, c->bind_mode); |
| 215 | s=BIO_get_accept_socket(c->param_addr,c->bind_mode); | ||
| 216 | if (s == -1) | 221 | if (s == -1) |
| 217 | return(-1); | 222 | return (-1); |
| 218 | 223 | ||
| 219 | if (c->accept_nbio) | 224 | if (c->accept_nbio) { |
| 220 | { | 225 | if (!BIO_socket_nbio(s, 1)) { |
| 221 | if (!BIO_socket_nbio(s,1)) | ||
| 222 | { | ||
| 223 | close(s); | 226 | close(s); |
| 224 | BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET); | 227 | BIOerr(BIO_F_ACPT_STATE, BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET); |
| 225 | return(-1); | 228 | return (-1); |
| 226 | } | ||
| 227 | } | 229 | } |
| 228 | c->accept_sock=s; | 230 | } |
| 229 | b->num=s; | 231 | c->accept_sock = s; |
| 230 | c->state=ACPT_S_GET_ACCEPT_SOCKET; | 232 | b->num = s; |
| 231 | return(1); | 233 | c->state = ACPT_S_GET_ACCEPT_SOCKET; |
| 234 | return (1); | ||
| 232 | /* break; */ | 235 | /* break; */ |
| 233 | case ACPT_S_GET_ACCEPT_SOCKET: | 236 | case ACPT_S_GET_ACCEPT_SOCKET: |
| 234 | if (b->next_bio != NULL) | 237 | if (b->next_bio != NULL) { |
| 235 | { | 238 | c->state = ACPT_S_OK; |
| 236 | c->state=ACPT_S_OK; | ||
| 237 | goto again; | 239 | goto again; |
| 238 | } | 240 | } |
| 239 | BIO_clear_retry_flags(b); | 241 | BIO_clear_retry_flags(b); |
| 240 | b->retry_reason=0; | 242 | b->retry_reason = 0; |
| 241 | i=BIO_accept(c->accept_sock,&(c->addr)); | 243 | i = BIO_accept(c->accept_sock, &(c->addr)); |
| 242 | 244 | ||
| 243 | /* -2 return means we should retry */ | 245 | /* -2 return means we should retry */ |
| 244 | if(i == -2) | 246 | if (i == -2) { |
| 245 | { | ||
| 246 | BIO_set_retry_special(b); | 247 | BIO_set_retry_special(b); |
| 247 | b->retry_reason=BIO_RR_ACCEPT; | 248 | b->retry_reason = BIO_RR_ACCEPT; |
| 248 | return -1; | 249 | return -1; |
| 249 | } | 250 | } |
| 250 | 251 | ||
| 251 | if (i < 0) return(i); | 252 | if (i < 0) |
| 253 | return (i); | ||
| 252 | 254 | ||
| 253 | bio=BIO_new_socket(i,BIO_CLOSE); | 255 | bio = BIO_new_socket(i, BIO_CLOSE); |
| 254 | if (bio == NULL) goto err; | 256 | if (bio == NULL) |
| 257 | goto err; | ||
| 255 | 258 | ||
| 256 | BIO_set_callback(bio,BIO_get_callback(b)); | 259 | BIO_set_callback(bio, BIO_get_callback(b)); |
| 257 | BIO_set_callback_arg(bio,BIO_get_callback_arg(b)); | 260 | BIO_set_callback_arg(bio, BIO_get_callback_arg(b)); |
| 258 | 261 | ||
| 259 | if (c->nbio) | 262 | if (c->nbio) { |
| 260 | { | 263 | if (!BIO_socket_nbio(i, 1)) { |
| 261 | if (!BIO_socket_nbio(i,1)) | 264 | BIOerr(BIO_F_ACPT_STATE, BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET); |
| 262 | { | ||
| 263 | BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET); | ||
| 264 | goto err; | 265 | goto err; |
| 265 | } | ||
| 266 | } | 266 | } |
| 267 | } | ||
| 267 | 268 | ||
| 268 | /* If the accept BIO has an bio_chain, we dup it and | 269 | /* If the accept BIO has an bio_chain, we dup it and |
| 269 | * put the new socket at the end. */ | 270 | * put the new socket at the end. */ |
| 270 | if (c->bio_chain != NULL) | 271 | if (c->bio_chain != NULL) { |
| 271 | { | 272 | if ((dbio = BIO_dup_chain(c->bio_chain)) == NULL) |
| 272 | if ((dbio=BIO_dup_chain(c->bio_chain)) == NULL) | ||
| 273 | goto err; | 273 | goto err; |
| 274 | if (!BIO_push(dbio,bio)) goto err; | 274 | if (!BIO_push(dbio, bio)) goto err; |
| 275 | bio=dbio; | 275 | bio = dbio; |
| 276 | } | 276 | } |
| 277 | if (BIO_push(b,bio) == NULL) goto err; | 277 | if (BIO_push(b, bio) |
| 278 | == NULL) goto err; | ||
| 279 | |||
| 280 | c->state = ACPT_S_OK; | ||
| 281 | return (1); | ||
| 278 | 282 | ||
| 279 | c->state=ACPT_S_OK; | ||
| 280 | return(1); | ||
| 281 | err: | 283 | err: |
| 282 | if (bio != NULL) | 284 | if (bio != NULL) |
| 283 | BIO_free(bio); | 285 | BIO_free(bio); |
| 284 | else if (s >= 0) | 286 | else if (s >= 0) |
| 285 | close(s); | 287 | close(s); |
| 286 | return(0); | 288 | return (0); |
| 287 | /* break; */ | 289 | /* break; */ |
| 288 | case ACPT_S_OK: | 290 | case ACPT_S_OK: |
| 289 | if (b->next_bio == NULL) | 291 | if (b->next_bio == NULL) { |
| 290 | { | 292 | c->state = ACPT_S_GET_ACCEPT_SOCKET; |
| 291 | c->state=ACPT_S_GET_ACCEPT_SOCKET; | ||
| 292 | goto again; | 293 | goto again; |
| 293 | } | 294 | } |
| 294 | return(1); | 295 | return (1); |
| 295 | /* break; */ | 296 | /* break; */ |
| 296 | default: | 297 | default: |
| 297 | return(0); | 298 | return (0); |
| 298 | /* break; */ | 299 | /* break; */ |
| 299 | } | ||
| 300 | |||
| 301 | } | 300 | } |
| 301 | } | ||
| 302 | 302 | ||
| 303 | static int acpt_read(BIO *b, char *out, int outl) | 303 | static int |
| 304 | { | 304 | acpt_read(BIO *b, char *out, int outl) |
| 305 | int ret=0; | 305 | { |
| 306 | int ret = 0; | ||
| 306 | BIO_ACCEPT *data; | 307 | BIO_ACCEPT *data; |
| 307 | 308 | ||
| 308 | BIO_clear_retry_flags(b); | 309 | BIO_clear_retry_flags(b); |
| 309 | data=(BIO_ACCEPT *)b->ptr; | 310 | data = (BIO_ACCEPT *)b->ptr; |
| 310 | 311 | ||
| 311 | while (b->next_bio == NULL) | 312 | while (b->next_bio == NULL) { |
| 312 | { | 313 | ret = acpt_state(b, data); |
| 313 | ret=acpt_state(b,data); | 314 | if (ret <= 0) |
| 314 | if (ret <= 0) return(ret); | 315 | return (ret); |
| 315 | } | 316 | } |
| 316 | 317 | ||
| 317 | ret=BIO_read(b->next_bio,out,outl); | 318 | ret = BIO_read(b->next_bio, out, outl); |
| 318 | BIO_copy_next_retry(b); | 319 | BIO_copy_next_retry(b); |
| 319 | return(ret); | 320 | return (ret); |
| 320 | } | 321 | } |
| 321 | 322 | ||
| 322 | static int acpt_write(BIO *b, const char *in, int inl) | 323 | static int |
| 323 | { | 324 | acpt_write(BIO *b, const char *in, int inl) |
| 325 | { | ||
| 324 | int ret; | 326 | int ret; |
| 325 | BIO_ACCEPT *data; | 327 | BIO_ACCEPT *data; |
| 326 | 328 | ||
| 327 | BIO_clear_retry_flags(b); | 329 | BIO_clear_retry_flags(b); |
| 328 | data=(BIO_ACCEPT *)b->ptr; | 330 | data = (BIO_ACCEPT *)b->ptr; |
| 329 | 331 | ||
| 330 | while (b->next_bio == NULL) | 332 | while (b->next_bio == NULL) { |
| 331 | { | 333 | ret = acpt_state(b, data); |
| 332 | ret=acpt_state(b,data); | 334 | if (ret <= 0) |
| 333 | if (ret <= 0) return(ret); | 335 | return (ret); |
| 334 | } | 336 | } |
| 335 | 337 | ||
| 336 | ret=BIO_write(b->next_bio,in,inl); | 338 | ret = BIO_write(b->next_bio, in, inl); |
| 337 | BIO_copy_next_retry(b); | 339 | BIO_copy_next_retry(b); |
| 338 | return(ret); | 340 | return (ret); |
| 339 | } | 341 | } |
| 340 | 342 | ||
| 341 | static long acpt_ctrl(BIO *b, int cmd, long num, void *ptr) | 343 | static long |
| 342 | { | 344 | acpt_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 345 | { | ||
| 343 | int *ip; | 346 | int *ip; |
| 344 | long ret=1; | 347 | long ret = 1; |
| 345 | BIO_ACCEPT *data; | 348 | BIO_ACCEPT *data; |
| 346 | char **pp; | 349 | char **pp; |
| 347 | 350 | ||
| 348 | data=(BIO_ACCEPT *)b->ptr; | 351 | data = (BIO_ACCEPT *)b->ptr; |
| 349 | 352 | ||
| 350 | switch (cmd) | 353 | switch (cmd) { |
| 351 | { | ||
| 352 | case BIO_CTRL_RESET: | 354 | case BIO_CTRL_RESET: |
| 353 | ret=0; | 355 | ret = 0; |
| 354 | data->state=ACPT_S_BEFORE; | 356 | data->state = ACPT_S_BEFORE; |
| 355 | acpt_close_socket(b); | 357 | acpt_close_socket(b); |
| 356 | b->flags=0; | 358 | b->flags = 0; |
| 357 | break; | 359 | break; |
| 358 | case BIO_C_DO_STATE_MACHINE: | 360 | case BIO_C_DO_STATE_MACHINE: |
| 359 | /* use this one to start the connection */ | 361 | /* use this one to start the connection */ |
| 360 | ret=(long)acpt_state(b,data); | 362 | ret = (long)acpt_state(b, data); |
| 361 | break; | 363 | break; |
| 362 | case BIO_C_SET_ACCEPT: | 364 | case BIO_C_SET_ACCEPT: |
| 363 | if (ptr != NULL) | 365 | if (ptr != NULL) { |
| 364 | { | 366 | if (num == 0) { |
| 365 | if (num == 0) | 367 | b->init = 1; |
| 366 | { | ||
| 367 | b->init=1; | ||
| 368 | if (data->param_addr != NULL) | 368 | if (data->param_addr != NULL) |
| 369 | OPENSSL_free(data->param_addr); | 369 | OPENSSL_free(data->param_addr); |
| 370 | data->param_addr=BUF_strdup(ptr); | 370 | data->param_addr = BUF_strdup(ptr); |
| 371 | } | 371 | } else if (num == 1) { |
| 372 | else if (num == 1) | 372 | data->accept_nbio = (ptr != NULL); |
| 373 | { | 373 | } else if (num == 2) { |
| 374 | data->accept_nbio=(ptr != NULL); | ||
| 375 | } | ||
| 376 | else if (num == 2) | ||
| 377 | { | ||
| 378 | if (data->bio_chain != NULL) | 374 | if (data->bio_chain != NULL) |
| 379 | BIO_free(data->bio_chain); | 375 | BIO_free(data->bio_chain); |
| 380 | data->bio_chain=(BIO *)ptr; | 376 | data->bio_chain = (BIO *)ptr; |
| 381 | } | ||
| 382 | } | 377 | } |
| 378 | } | ||
| 383 | break; | 379 | break; |
| 384 | case BIO_C_SET_NBIO: | 380 | case BIO_C_SET_NBIO: |
| 385 | data->nbio=(int)num; | 381 | data->nbio = (int)num; |
| 386 | break; | 382 | break; |
| 387 | case BIO_C_SET_FD: | 383 | case BIO_C_SET_FD: |
| 388 | b->init=1; | 384 | b->init = 1; |
| 389 | b->num= *((int *)ptr); | 385 | b->num= *((int *)ptr); |
| 390 | data->accept_sock=b->num; | 386 | data->accept_sock = b->num; |
| 391 | data->state=ACPT_S_GET_ACCEPT_SOCKET; | 387 | data->state = ACPT_S_GET_ACCEPT_SOCKET; |
| 392 | b->shutdown=(int)num; | 388 | b->shutdown = (int)num; |
| 393 | b->init=1; | 389 | b->init = 1; |
| 394 | break; | 390 | break; |
| 395 | case BIO_C_GET_FD: | 391 | case BIO_C_GET_FD: |
| 396 | if (b->init) | 392 | if (b->init) { |
| 397 | { | 393 | ip = (int *)ptr; |
| 398 | ip=(int *)ptr; | ||
| 399 | if (ip != NULL) | 394 | if (ip != NULL) |
| 400 | *ip=data->accept_sock; | 395 | *ip = data->accept_sock; |
| 401 | ret=data->accept_sock; | 396 | ret = data->accept_sock; |
| 402 | } | 397 | } else |
| 403 | else | 398 | ret = -1; |
| 404 | ret= -1; | ||
| 405 | break; | 399 | break; |
| 406 | case BIO_C_GET_ACCEPT: | 400 | case BIO_C_GET_ACCEPT: |
| 407 | if (b->init) | 401 | if (b->init) { |
| 408 | { | 402 | if (ptr != NULL) { |
| 409 | if (ptr != NULL) | 403 | pp = (char **)ptr; |
| 410 | { | 404 | *pp = data->param_addr; |
| 411 | pp=(char **)ptr; | 405 | } else |
| 412 | *pp=data->param_addr; | 406 | ret = -1; |
| 413 | } | 407 | } else |
| 414 | else | 408 | ret = -1; |
| 415 | ret= -1; | ||
| 416 | } | ||
| 417 | else | ||
| 418 | ret= -1; | ||
| 419 | break; | 409 | break; |
| 420 | case BIO_CTRL_GET_CLOSE: | 410 | case BIO_CTRL_GET_CLOSE: |
| 421 | ret=b->shutdown; | 411 | ret = b->shutdown; |
| 422 | break; | 412 | break; |
| 423 | case BIO_CTRL_SET_CLOSE: | 413 | case BIO_CTRL_SET_CLOSE: |
| 424 | b->shutdown=(int)num; | 414 | b->shutdown = (int)num; |
| 425 | break; | 415 | break; |
| 426 | case BIO_CTRL_PENDING: | 416 | case BIO_CTRL_PENDING: |
| 427 | case BIO_CTRL_WPENDING: | 417 | case BIO_CTRL_WPENDING: |
| 428 | ret=0; | 418 | ret = 0; |
| 429 | break; | 419 | break; |
| 430 | case BIO_CTRL_FLUSH: | 420 | case BIO_CTRL_FLUSH: |
| 431 | break; | 421 | break; |
| 432 | case BIO_C_SET_BIND_MODE: | 422 | case BIO_C_SET_BIND_MODE: |
| 433 | data->bind_mode=(int)num; | 423 | data->bind_mode = (int)num; |
| 434 | break; | 424 | break; |
| 435 | case BIO_C_GET_BIND_MODE: | 425 | case BIO_C_GET_BIND_MODE: |
| 436 | ret=(long)data->bind_mode; | 426 | ret = (long)data->bind_mode; |
| 437 | break; | 427 | break; |
| 438 | case BIO_CTRL_DUP: | 428 | case BIO_CTRL_DUP: |
| 439 | /* dbio=(BIO *)ptr; | 429 | /* dbio=(BIO *)ptr; |
| @@ -441,38 +431,41 @@ static long acpt_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 441 | BIO_set_port(dbio,data->param_port); | 431 | BIO_set_port(dbio,data->param_port); |
| 442 | if (data->param_hostname) | 432 | if (data->param_hostname) |
| 443 | BIO_set_hostname(dbio,data->param_hostname); | 433 | BIO_set_hostname(dbio,data->param_hostname); |
| 444 | BIO_set_nbio(dbio,data->nbio); */ | 434 | BIO_set_nbio(dbio,data->nbio); |
| 435 | */ | ||
| 445 | break; | 436 | break; |
| 446 | 437 | ||
| 447 | default: | 438 | default: |
| 448 | ret=0; | 439 | ret = 0; |
| 449 | break; | 440 | break; |
| 450 | } | ||
| 451 | return(ret); | ||
| 452 | } | 441 | } |
| 453 | 442 | return (ret); | |
| 454 | static int acpt_puts(BIO *bp, const char *str) | 443 | } |
| 455 | { | 444 | |
| 456 | int n,ret; | 445 | static int |
| 457 | 446 | acpt_puts(BIO *bp, const char *str) | |
| 458 | n=strlen(str); | 447 | { |
| 459 | ret=acpt_write(bp,str,n); | 448 | int n, ret; |
| 460 | return(ret); | 449 | |
| 461 | } | 450 | n = strlen(str); |
| 462 | 451 | ret = acpt_write(bp, str, n); | |
| 463 | BIO *BIO_new_accept(char *str) | 452 | return (ret); |
| 464 | { | 453 | } |
| 454 | |||
| 455 | BIO | ||
| 456 | *BIO_new_accept(char *str) | ||
| 457 | { | ||
| 465 | BIO *ret; | 458 | BIO *ret; |
| 466 | 459 | ||
| 467 | ret=BIO_new(BIO_s_accept()); | 460 | ret = BIO_new(BIO_s_accept()); |
| 468 | if (ret == NULL) return(NULL); | 461 | if (ret == NULL) |
| 469 | if (BIO_set_accept_port(ret,str)) | 462 | return (NULL); |
| 470 | return(ret); | 463 | if (BIO_set_accept_port(ret, str)) |
| 471 | else | 464 | return (ret); |
| 472 | { | 465 | else { |
| 473 | BIO_free(ret); | 466 | BIO_free(ret); |
| 474 | return(NULL); | 467 | return (NULL); |
| 475 | } | ||
| 476 | } | 468 | } |
| 469 | } | ||
| 477 | 470 | ||
| 478 | #endif | 471 | #endif |
diff --git a/src/lib/libssl/src/crypto/bio/bss_bio.c b/src/lib/libssl/src/crypto/bio/bss_bio.c index 52ef0ebcb3..a74fcfdabc 100644 --- a/src/lib/libssl/src/crypto/bio/bss_bio.c +++ b/src/lib/libssl/src/crypto/bio/bss_bio.c | |||
| @@ -103,8 +103,7 @@ static int bio_puts(BIO *bio, const char *str); | |||
| 103 | static int bio_make_pair(BIO *bio1, BIO *bio2); | 103 | static int bio_make_pair(BIO *bio1, BIO *bio2); |
| 104 | static void bio_destroy_pair(BIO *bio); | 104 | static void bio_destroy_pair(BIO *bio); |
| 105 | 105 | ||
| 106 | static BIO_METHOD methods_biop = | 106 | static BIO_METHOD methods_biop = { |
| 107 | { | ||
| 108 | BIO_TYPE_BIO, | 107 | BIO_TYPE_BIO, |
| 109 | "BIO pair", | 108 | "BIO pair", |
| 110 | bio_write, | 109 | bio_write, |
| @@ -117,50 +116,51 @@ static BIO_METHOD methods_biop = | |||
| 117 | NULL /* no bio_callback_ctrl */ | 116 | NULL /* no bio_callback_ctrl */ |
| 118 | }; | 117 | }; |
| 119 | 118 | ||
| 120 | BIO_METHOD *BIO_s_bio(void) | 119 | BIO_METHOD |
| 121 | { | 120 | *BIO_s_bio(void) |
| 121 | { | ||
| 122 | return &methods_biop; | 122 | return &methods_biop; |
| 123 | } | 123 | } |
| 124 | |||
| 125 | struct bio_bio_st { | ||
| 126 | BIO *peer; /* NULL if buf == NULL. | ||
| 127 | * If peer != NULL, then peer->ptr is also a bio_bio_st, | ||
| 128 | * and its "peer" member points back to us. | ||
| 129 | * peer != NULL iff init != 0 in the BIO. */ | ||
| 124 | 130 | ||
| 125 | struct bio_bio_st | ||
| 126 | { | ||
| 127 | BIO *peer; /* NULL if buf == NULL. | ||
| 128 | * If peer != NULL, then peer->ptr is also a bio_bio_st, | ||
| 129 | * and its "peer" member points back to us. | ||
| 130 | * peer != NULL iff init != 0 in the BIO. */ | ||
| 131 | |||
| 132 | /* This is for what we write (i.e. reading uses peer's struct): */ | 131 | /* This is for what we write (i.e. reading uses peer's struct): */ |
| 133 | int closed; /* valid iff peer != NULL */ | 132 | int closed; /* valid iff peer != NULL */ |
| 134 | size_t len; /* valid iff buf != NULL; 0 if peer == NULL */ | 133 | size_t len; /* valid iff buf != NULL; 0 if peer == NULL */ |
| 135 | size_t offset; /* valid iff buf != NULL; 0 if len == 0 */ | 134 | size_t offset; /* valid iff buf != NULL; 0 if len == 0 */ |
| 136 | size_t size; | 135 | size_t size; |
| 137 | char *buf; /* "size" elements (if != NULL) */ | 136 | char *buf; /* "size" elements (if != NULL) */ |
| 138 | 137 | ||
| 139 | size_t request; /* valid iff peer != NULL; 0 if len != 0, | 138 | size_t request; /* valid iff peer != NULL; 0 if len != 0, |
| 140 | * otherwise set by peer to number of bytes | 139 | * otherwise set by peer to number of bytes |
| 141 | * it (unsuccessfully) tried to read, | 140 | * it (unsuccessfully) tried to read, |
| 142 | * never more than buffer space (size-len) warrants. */ | 141 | * never more than buffer space (size-len) warrants. */ |
| 143 | }; | 142 | }; |
| 144 | 143 | ||
| 145 | static int bio_new(BIO *bio) | 144 | static int |
| 146 | { | 145 | bio_new(BIO *bio) |
| 146 | { | ||
| 147 | struct bio_bio_st *b; | 147 | struct bio_bio_st *b; |
| 148 | 148 | ||
| 149 | b = OPENSSL_malloc(sizeof *b); | 149 | b = OPENSSL_malloc(sizeof *b); |
| 150 | if (b == NULL) | 150 | if (b == NULL) |
| 151 | return 0; | 151 | return 0; |
| 152 | 152 | ||
| 153 | b->peer = NULL; | 153 | b->peer = NULL; |
| 154 | b->size = 17*1024; /* enough for one TLS record (just a default) */ | 154 | b->size = 17 * 1024; /* enough for one TLS record (just a default) */ |
| 155 | b->buf = NULL; | 155 | b->buf = NULL; |
| 156 | 156 | ||
| 157 | bio->ptr = b; | 157 | bio->ptr = b; |
| 158 | return 1; | 158 | return 1; |
| 159 | } | 159 | } |
| 160 | 160 | ||
| 161 | 161 | static int | |
| 162 | static int bio_free(BIO *bio) | 162 | bio_free(BIO *bio) |
| 163 | { | 163 | { |
| 164 | struct bio_bio_st *b; | 164 | struct bio_bio_st *b; |
| 165 | 165 | ||
| 166 | if (bio == NULL) | 166 | if (bio == NULL) |
| @@ -171,21 +171,21 @@ static int bio_free(BIO *bio) | |||
| 171 | 171 | ||
| 172 | if (b->peer) | 172 | if (b->peer) |
| 173 | bio_destroy_pair(bio); | 173 | bio_destroy_pair(bio); |
| 174 | 174 | ||
| 175 | if (b->buf != NULL) | 175 | if (b->buf != NULL) { |
| 176 | { | ||
| 177 | OPENSSL_free(b->buf); | 176 | OPENSSL_free(b->buf); |
| 178 | } | 177 | } |
| 179 | 178 | ||
| 180 | OPENSSL_free(b); | 179 | OPENSSL_free(b); |
| 181 | 180 | ||
| 182 | return 1; | 181 | return 1; |
| 183 | } | 182 | } |
| 184 | 183 | ||
| 185 | 184 | ||
| 186 | 185 | ||
| 187 | static int bio_read(BIO *bio, char *buf, int size_) | 186 | static int |
| 188 | { | 187 | bio_read(BIO *bio, char *buf, int size_) |
| 188 | { | ||
| 189 | size_t size = size_; | 189 | size_t size = size_; |
| 190 | size_t rest; | 190 | size_t rest; |
| 191 | struct bio_bio_st *b, *peer_b; | 191 | struct bio_bio_st *b, *peer_b; |
| @@ -207,12 +207,10 @@ static int bio_read(BIO *bio, char *buf, int size_) | |||
| 207 | if (buf == NULL || size == 0) | 207 | if (buf == NULL || size == 0) |
| 208 | return 0; | 208 | return 0; |
| 209 | 209 | ||
| 210 | if (peer_b->len == 0) | 210 | if (peer_b->len == 0) { |
| 211 | { | ||
| 212 | if (peer_b->closed) | 211 | if (peer_b->closed) |
| 213 | return 0; /* writer has closed, and no data is left */ | 212 | return 0; /* writer has closed, and no data is left */ |
| 214 | else | 213 | else { |
| 215 | { | ||
| 216 | BIO_set_retry_read(bio); /* buffer is empty */ | 214 | BIO_set_retry_read(bio); /* buffer is empty */ |
| 217 | if (size <= peer_b->size) | 215 | if (size <= peer_b->size) |
| 218 | peer_b->request = size; | 216 | peer_b->request = size; |
| @@ -221,22 +219,22 @@ static int bio_read(BIO *bio, char *buf, int size_) | |||
| 221 | * deliver in one write */ | 219 | * deliver in one write */ |
| 222 | peer_b->request = peer_b->size; | 220 | peer_b->request = peer_b->size; |
| 223 | return -1; | 221 | return -1; |
| 224 | } | ||
| 225 | } | 222 | } |
| 223 | } | ||
| 226 | 224 | ||
| 227 | /* we can read */ | 225 | /* we can read */ |
| 228 | if (peer_b->len < size) | 226 | if (peer_b->len < size) |
| 229 | size = peer_b->len; | 227 | size = peer_b->len; |
| 230 | 228 | ||
| 231 | /* now read "size" bytes */ | 229 | /* now read "size" bytes */ |
| 232 | 230 | ||
| 233 | rest = size; | 231 | rest = size; |
| 234 | 232 | ||
| 235 | assert(rest > 0); | 233 | assert(rest > 0); |
| 236 | do /* one or two iterations */ | 234 | do /* one or two iterations */ |
| 237 | { | 235 | { |
| 238 | size_t chunk; | 236 | size_t chunk; |
| 239 | 237 | ||
| 240 | assert(rest <= peer_b->len); | 238 | assert(rest <= peer_b->len); |
| 241 | if (peer_b->offset + rest <= peer_b->size) | 239 | if (peer_b->offset + rest <= peer_b->size) |
| 242 | chunk = rest; | 240 | chunk = rest; |
| @@ -244,30 +242,26 @@ static int bio_read(BIO *bio, char *buf, int size_) | |||
| 244 | /* wrap around ring buffer */ | 242 | /* wrap around ring buffer */ |
| 245 | chunk = peer_b->size - peer_b->offset; | 243 | chunk = peer_b->size - peer_b->offset; |
| 246 | assert(peer_b->offset + chunk <= peer_b->size); | 244 | assert(peer_b->offset + chunk <= peer_b->size); |
| 247 | 245 | ||
| 248 | memcpy(buf, peer_b->buf + peer_b->offset, chunk); | 246 | memcpy(buf, peer_b->buf + peer_b->offset, chunk); |
| 249 | 247 | ||
| 250 | peer_b->len -= chunk; | 248 | peer_b->len -= chunk; |
| 251 | if (peer_b->len) | 249 | if (peer_b->len) { |
| 252 | { | ||
| 253 | peer_b->offset += chunk; | 250 | peer_b->offset += chunk; |
| 254 | assert(peer_b->offset <= peer_b->size); | 251 | assert(peer_b->offset <= peer_b->size); |
| 255 | if (peer_b->offset == peer_b->size) | 252 | if (peer_b->offset == peer_b->size) |
| 256 | peer_b->offset = 0; | 253 | peer_b->offset = 0; |
| 257 | buf += chunk; | 254 | buf += chunk; |
| 258 | } | 255 | } else { |
| 259 | else | ||
| 260 | { | ||
| 261 | /* buffer now empty, no need to advance "buf" */ | 256 | /* buffer now empty, no need to advance "buf" */ |
| 262 | assert(chunk == rest); | 257 | assert(chunk == rest); |
| 263 | peer_b->offset = 0; | 258 | peer_b->offset = 0; |
| 264 | } | ||
| 265 | rest -= chunk; | ||
| 266 | } | 259 | } |
| 267 | while (rest); | 260 | rest -= chunk; |
| 268 | 261 | } while (rest); | |
| 262 | |||
| 269 | return size; | 263 | return size; |
| 270 | } | 264 | } |
| 271 | 265 | ||
| 272 | /* non-copying interface: provide pointer to available data in buffer | 266 | /* non-copying interface: provide pointer to available data in buffer |
| 273 | * bio_nread0: return number of available bytes | 267 | * bio_nread0: return number of available bytes |
| @@ -277,32 +271,32 @@ static int bio_read(BIO *bio, char *buf, int size_) | |||
| 277 | */ | 271 | */ |
| 278 | /* WARNING: The non-copying interface is largely untested as of yet | 272 | /* WARNING: The non-copying interface is largely untested as of yet |
| 279 | * and may contain bugs. */ | 273 | * and may contain bugs. */ |
| 280 | static ossl_ssize_t bio_nread0(BIO *bio, char **buf) | 274 | static ossl_ssize_t |
| 281 | { | 275 | bio_nread0(BIO *bio, char **buf) |
| 276 | { | ||
| 282 | struct bio_bio_st *b, *peer_b; | 277 | struct bio_bio_st *b, *peer_b; |
| 283 | ossl_ssize_t num; | 278 | ossl_ssize_t num; |
| 284 | 279 | ||
| 285 | BIO_clear_retry_flags(bio); | 280 | BIO_clear_retry_flags(bio); |
| 286 | 281 | ||
| 287 | if (!bio->init) | 282 | if (!bio->init) |
| 288 | return 0; | 283 | return 0; |
| 289 | 284 | ||
| 290 | b = bio->ptr; | 285 | b = bio->ptr; |
| 291 | assert(b != NULL); | 286 | assert(b != NULL); |
| 292 | assert(b->peer != NULL); | 287 | assert(b->peer != NULL); |
| 293 | peer_b = b->peer->ptr; | 288 | peer_b = b->peer->ptr; |
| 294 | assert(peer_b != NULL); | 289 | assert(peer_b != NULL); |
| 295 | assert(peer_b->buf != NULL); | 290 | assert(peer_b->buf != NULL); |
| 296 | 291 | ||
| 297 | peer_b->request = 0; | 292 | peer_b->request = 0; |
| 298 | 293 | ||
| 299 | if (peer_b->len == 0) | 294 | if (peer_b->len == 0) { |
| 300 | { | ||
| 301 | char dummy; | 295 | char dummy; |
| 302 | 296 | ||
| 303 | /* avoid code duplication -- nothing available for reading */ | 297 | /* avoid code duplication -- nothing available for reading */ |
| 304 | return bio_read(bio, &dummy, 1); /* returns 0 or -1 */ | 298 | return bio_read(bio, &dummy, 1); /* returns 0 or -1 */ |
| 305 | } | 299 | } |
| 306 | 300 | ||
| 307 | num = peer_b->len; | 301 | num = peer_b->len; |
| 308 | if (peer_b->size < peer_b->offset + num) | 302 | if (peer_b->size < peer_b->offset + num) |
| @@ -313,10 +307,11 @@ static ossl_ssize_t bio_nread0(BIO *bio, char **buf) | |||
| 313 | if (buf != NULL) | 307 | if (buf != NULL) |
| 314 | *buf = peer_b->buf + peer_b->offset; | 308 | *buf = peer_b->buf + peer_b->offset; |
| 315 | return num; | 309 | return num; |
| 316 | } | 310 | } |
| 317 | 311 | ||
| 318 | static ossl_ssize_t bio_nread(BIO *bio, char **buf, size_t num_) | 312 | static ossl_ssize_t |
| 319 | { | 313 | bio_nread(BIO *bio, char **buf, size_t num_) |
| 314 | { | ||
| 320 | struct bio_bio_st *b, *peer_b; | 315 | struct bio_bio_st *b, *peer_b; |
| 321 | ossl_ssize_t num, available; | 316 | ossl_ssize_t num, available; |
| 322 | 317 | ||
| @@ -335,22 +330,21 @@ static ossl_ssize_t bio_nread(BIO *bio, char **buf, size_t num_) | |||
| 335 | peer_b = b->peer->ptr; | 330 | peer_b = b->peer->ptr; |
| 336 | 331 | ||
| 337 | peer_b->len -= num; | 332 | peer_b->len -= num; |
| 338 | if (peer_b->len) | 333 | if (peer_b->len) { |
| 339 | { | ||
| 340 | peer_b->offset += num; | 334 | peer_b->offset += num; |
| 341 | assert(peer_b->offset <= peer_b->size); | 335 | assert(peer_b->offset <= peer_b->size); |
| 342 | if (peer_b->offset == peer_b->size) | 336 | if (peer_b->offset == peer_b->size) |
| 343 | peer_b->offset = 0; | 337 | peer_b->offset = 0; |
| 344 | } | 338 | } else |
| 345 | else | ||
| 346 | peer_b->offset = 0; | 339 | peer_b->offset = 0; |
| 347 | 340 | ||
| 348 | return num; | 341 | return num; |
| 349 | } | 342 | } |
| 350 | 343 | ||
| 351 | 344 | ||
| 352 | static int bio_write(BIO *bio, const char *buf, int num_) | 345 | static int |
| 353 | { | 346 | bio_write(BIO *bio, const char *buf, int num_) |
| 347 | { | ||
| 354 | size_t num = num_; | 348 | size_t num = num_; |
| 355 | size_t rest; | 349 | size_t rest; |
| 356 | struct bio_bio_st *b; | 350 | struct bio_bio_st *b; |
| @@ -360,38 +354,37 @@ static int bio_write(BIO *bio, const char *buf, int num_) | |||
| 360 | if (!bio->init || buf == NULL || num == 0) | 354 | if (!bio->init || buf == NULL || num == 0) |
| 361 | return 0; | 355 | return 0; |
| 362 | 356 | ||
| 363 | b = bio->ptr; | 357 | b = bio->ptr; |
| 358 | |||
| 364 | assert(b != NULL); | 359 | assert(b != NULL); |
| 365 | assert(b->peer != NULL); | 360 | assert(b->peer != NULL); |
| 366 | assert(b->buf != NULL); | 361 | assert(b->buf != NULL); |
| 367 | 362 | ||
| 368 | b->request = 0; | 363 | b->request = 0; |
| 369 | if (b->closed) | 364 | if (b->closed) { |
| 370 | { | ||
| 371 | /* we already closed */ | 365 | /* we already closed */ |
| 372 | BIOerr(BIO_F_BIO_WRITE, BIO_R_BROKEN_PIPE); | 366 | BIOerr(BIO_F_BIO_WRITE, BIO_R_BROKEN_PIPE); |
| 373 | return -1; | 367 | return -1; |
| 374 | } | 368 | } |
| 375 | 369 | ||
| 376 | assert(b->len <= b->size); | 370 | assert(b->len <= b->size); |
| 377 | 371 | ||
| 378 | if (b->len == b->size) | 372 | if (b->len == b->size) { |
| 379 | { | ||
| 380 | BIO_set_retry_write(bio); /* buffer is full */ | 373 | BIO_set_retry_write(bio); /* buffer is full */ |
| 381 | return -1; | 374 | return -1; |
| 382 | } | 375 | } |
| 383 | 376 | ||
| 384 | /* we can write */ | 377 | /* we can write */ |
| 385 | if (num > b->size - b->len) | 378 | if (num > b->size - b->len) |
| 386 | num = b->size - b->len; | 379 | num = b->size - b->len; |
| 387 | 380 | ||
| 388 | /* now write "num" bytes */ | 381 | /* now write "num" bytes */ |
| 389 | 382 | ||
| 390 | rest = num; | 383 | rest = num; |
| 391 | 384 | ||
| 392 | assert(rest > 0); | 385 | assert(rest > 0); |
| 393 | do /* one or two iterations */ | 386 | do /* one or two iterations */ |
| 394 | { | 387 | { |
| 395 | size_t write_offset; | 388 | size_t write_offset; |
| 396 | size_t chunk; | 389 | size_t chunk; |
| 397 | 390 | ||
| @@ -407,20 +400,19 @@ static int bio_write(BIO *bio, const char *buf, int num_) | |||
| 407 | else | 400 | else |
| 408 | /* wrap around ring buffer */ | 401 | /* wrap around ring buffer */ |
| 409 | chunk = b->size - write_offset; | 402 | chunk = b->size - write_offset; |
| 410 | 403 | ||
| 411 | memcpy(b->buf + write_offset, buf, chunk); | 404 | memcpy(b->buf + write_offset, buf, chunk); |
| 412 | 405 | ||
| 413 | b->len += chunk; | 406 | b->len += chunk; |
| 414 | 407 | ||
| 415 | assert(b->len <= b->size); | 408 | assert(b->len <= b->size); |
| 416 | 409 | ||
| 417 | rest -= chunk; | 410 | rest -= chunk; |
| 418 | buf += chunk; | 411 | buf += chunk; |
| 419 | } | 412 | } while (rest); |
| 420 | while (rest); | ||
| 421 | 413 | ||
| 422 | return num; | 414 | return num; |
| 423 | } | 415 | } |
| 424 | 416 | ||
| 425 | /* non-copying interface: provide pointer to region to write to | 417 | /* non-copying interface: provide pointer to region to write to |
| 426 | * bio_nwrite0: check how much space is available | 418 | * bio_nwrite0: check how much space is available |
| @@ -428,8 +420,9 @@ static int bio_write(BIO *bio, const char *buf, int num_) | |||
| 428 | * (example usage: bio_nwrite0(), write to buffer, bio_nwrite() | 420 | * (example usage: bio_nwrite0(), write to buffer, bio_nwrite() |
| 429 | * or just bio_nwrite(), write to buffer) | 421 | * or just bio_nwrite(), write to buffer) |
| 430 | */ | 422 | */ |
| 431 | static ossl_ssize_t bio_nwrite0(BIO *bio, char **buf) | 423 | static ossl_ssize_t |
| 432 | { | 424 | bio_nwrite0(BIO *bio, char **buf) |
| 425 | { | ||
| 433 | struct bio_bio_st *b; | 426 | struct bio_bio_st *b; |
| 434 | size_t num; | 427 | size_t num; |
| 435 | size_t write_offset; | 428 | size_t write_offset; |
| @@ -439,25 +432,24 @@ static ossl_ssize_t bio_nwrite0(BIO *bio, char **buf) | |||
| 439 | if (!bio->init) | 432 | if (!bio->init) |
| 440 | return 0; | 433 | return 0; |
| 441 | 434 | ||
| 442 | b = bio->ptr; | 435 | b = bio->ptr; |
| 436 | |||
| 443 | assert(b != NULL); | 437 | assert(b != NULL); |
| 444 | assert(b->peer != NULL); | 438 | assert(b->peer != NULL); |
| 445 | assert(b->buf != NULL); | 439 | assert(b->buf != NULL); |
| 446 | 440 | ||
| 447 | b->request = 0; | 441 | b->request = 0; |
| 448 | if (b->closed) | 442 | if (b->closed) { |
| 449 | { | ||
| 450 | BIOerr(BIO_F_BIO_NWRITE0, BIO_R_BROKEN_PIPE); | 443 | BIOerr(BIO_F_BIO_NWRITE0, BIO_R_BROKEN_PIPE); |
| 451 | return -1; | 444 | return -1; |
| 452 | } | 445 | } |
| 453 | 446 | ||
| 454 | assert(b->len <= b->size); | 447 | assert(b->len <= b->size); |
| 455 | 448 | ||
| 456 | if (b->len == b->size) | 449 | if (b->len == b->size) { |
| 457 | { | ||
| 458 | BIO_set_retry_write(bio); | 450 | BIO_set_retry_write(bio); |
| 459 | return -1; | 451 | return -1; |
| 460 | } | 452 | } |
| 461 | 453 | ||
| 462 | num = b->size - b->len; | 454 | num = b->size - b->len; |
| 463 | write_offset = b->offset + b->len; | 455 | write_offset = b->offset + b->len; |
| @@ -474,10 +466,11 @@ static ossl_ssize_t bio_nwrite0(BIO *bio, char **buf) | |||
| 474 | assert(write_offset + num <= b->size); | 466 | assert(write_offset + num <= b->size); |
| 475 | 467 | ||
| 476 | return num; | 468 | return num; |
| 477 | } | 469 | } |
| 478 | 470 | ||
| 479 | static ossl_ssize_t bio_nwrite(BIO *bio, char **buf, size_t num_) | 471 | static ossl_ssize_t |
| 480 | { | 472 | bio_nwrite(BIO *bio, char **buf, size_t num_) |
| 473 | { | ||
| 481 | struct bio_bio_st *b; | 474 | struct bio_bio_st *b; |
| 482 | ossl_ssize_t num, space; | 475 | ossl_ssize_t num, space; |
| 483 | 476 | ||
| @@ -497,46 +490,39 @@ static ossl_ssize_t bio_nwrite(BIO *bio, char **buf, size_t num_) | |||
| 497 | assert(b->len <= b->size); | 490 | assert(b->len <= b->size); |
| 498 | 491 | ||
| 499 | return num; | 492 | return num; |
| 500 | } | 493 | } |
| 501 | 494 | ||
| 502 | 495 | ||
| 503 | static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | 496 | static long |
| 504 | { | 497 | bio_ctrl(BIO *bio, int cmd, long num, void *ptr) |
| 498 | { | ||
| 505 | long ret; | 499 | long ret; |
| 506 | struct bio_bio_st *b = bio->ptr; | 500 | struct bio_bio_st *b = bio->ptr; |
| 507 | 501 | ||
| 508 | assert(b != NULL); | 502 | assert(b != NULL); |
| 509 | 503 | ||
| 510 | switch (cmd) | 504 | switch (cmd) { |
| 511 | { | 505 | /* specific CTRL codes */ |
| 512 | /* specific CTRL codes */ | ||
| 513 | 506 | ||
| 514 | case BIO_C_SET_WRITE_BUF_SIZE: | 507 | case BIO_C_SET_WRITE_BUF_SIZE: |
| 515 | if (b->peer) | 508 | if (b->peer) { |
| 516 | { | ||
| 517 | BIOerr(BIO_F_BIO_CTRL, BIO_R_IN_USE); | 509 | BIOerr(BIO_F_BIO_CTRL, BIO_R_IN_USE); |
| 518 | ret = 0; | 510 | ret = 0; |
| 519 | } | 511 | } else if (num == 0) { |
| 520 | else if (num == 0) | ||
| 521 | { | ||
| 522 | BIOerr(BIO_F_BIO_CTRL, BIO_R_INVALID_ARGUMENT); | 512 | BIOerr(BIO_F_BIO_CTRL, BIO_R_INVALID_ARGUMENT); |
| 523 | ret = 0; | 513 | ret = 0; |
| 524 | } | 514 | } else { |
| 525 | else | ||
| 526 | { | ||
| 527 | size_t new_size = num; | 515 | size_t new_size = num; |
| 528 | 516 | ||
| 529 | if (b->size != new_size) | 517 | if (b->size != new_size) { |
| 530 | { | 518 | if (b->buf) { |
| 531 | if (b->buf) | ||
| 532 | { | ||
| 533 | OPENSSL_free(b->buf); | 519 | OPENSSL_free(b->buf); |
| 534 | b->buf = NULL; | 520 | b->buf = NULL; |
| 535 | } | ||
| 536 | b->size = new_size; | ||
| 537 | } | 521 | } |
| 538 | ret = 1; | 522 | b->size = new_size; |
| 539 | } | 523 | } |
| 524 | ret = 1; | ||
| 525 | } | ||
| 540 | break; | 526 | break; |
| 541 | 527 | ||
| 542 | case BIO_C_GET_WRITE_BUF_SIZE: | 528 | case BIO_C_GET_WRITE_BUF_SIZE: |
| @@ -545,15 +531,15 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 545 | 531 | ||
| 546 | case BIO_C_MAKE_BIO_PAIR: | 532 | case BIO_C_MAKE_BIO_PAIR: |
| 547 | { | 533 | { |
| 548 | BIO *other_bio = ptr; | 534 | BIO *other_bio = ptr; |
| 549 | 535 | ||
| 550 | if (bio_make_pair(bio, other_bio)) | 536 | if (bio_make_pair(bio, other_bio)) |
| 551 | ret = 1; | 537 | ret = 1; |
| 552 | else | 538 | else |
| 553 | ret = 0; | 539 | ret = 0; |
| 554 | } | 540 | } |
| 555 | break; | 541 | break; |
| 556 | 542 | ||
| 557 | case BIO_C_DESTROY_BIO_PAIR: | 543 | case BIO_C_DESTROY_BIO_PAIR: |
| 558 | /* Affects both BIOs in the pair -- call just once! | 544 | /* Affects both BIOs in the pair -- call just once! |
| 559 | * Or let BIO_free(bio1); BIO_free(bio2); do the job. */ | 545 | * Or let BIO_free(bio1); BIO_free(bio2); do the job. */ |
| @@ -596,12 +582,12 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 596 | /* prepare for non-copying read */ | 582 | /* prepare for non-copying read */ |
| 597 | ret = (long) bio_nread0(bio, ptr); | 583 | ret = (long) bio_nread0(bio, ptr); |
| 598 | break; | 584 | break; |
| 599 | 585 | ||
| 600 | case BIO_C_NREAD: | 586 | case BIO_C_NREAD: |
| 601 | /* non-copying read */ | 587 | /* non-copying read */ |
| 602 | ret = (long) bio_nread(bio, ptr, (size_t) num); | 588 | ret = (long) bio_nread(bio, ptr, (size_t) num); |
| 603 | break; | 589 | break; |
| 604 | 590 | ||
| 605 | case BIO_C_NWRITE0: | 591 | case BIO_C_NWRITE0: |
| 606 | /* prepare for non-copying write */ | 592 | /* prepare for non-copying write */ |
| 607 | ret = (long) bio_nwrite0(bio, ptr); | 593 | ret = (long) bio_nwrite0(bio, ptr); |
| @@ -611,18 +597,18 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 611 | /* non-copying write */ | 597 | /* non-copying write */ |
| 612 | ret = (long) bio_nwrite(bio, ptr, (size_t) num); | 598 | ret = (long) bio_nwrite(bio, ptr, (size_t) num); |
| 613 | break; | 599 | break; |
| 614 | |||
| 615 | 600 | ||
| 616 | /* standard CTRL codes follow */ | 601 | |
| 602 | /* standard CTRL codes follow */ | ||
| 617 | 603 | ||
| 618 | case BIO_CTRL_RESET: | 604 | case BIO_CTRL_RESET: |
| 619 | if (b->buf != NULL) | 605 | if (b->buf != NULL) { |
| 620 | { | ||
| 621 | b->len = 0; | 606 | b->len = 0; |
| 622 | b->offset = 0; | 607 | b->offset = 0; |
| 623 | } | 608 | } |
| 624 | ret = 0; | 609 | ret = 0; |
| 625 | break; | 610 | break; |
| 611 | |||
| 626 | 612 | ||
| 627 | case BIO_CTRL_GET_CLOSE: | 613 | case BIO_CTRL_GET_CLOSE: |
| 628 | ret = bio->shutdown; | 614 | ret = bio->shutdown; |
| @@ -634,13 +620,11 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 634 | break; | 620 | break; |
| 635 | 621 | ||
| 636 | case BIO_CTRL_PENDING: | 622 | case BIO_CTRL_PENDING: |
| 637 | if (b->peer != NULL) | 623 | if (b->peer != NULL) { |
| 638 | { | ||
| 639 | struct bio_bio_st *peer_b = b->peer->ptr; | 624 | struct bio_bio_st *peer_b = b->peer->ptr; |
| 640 | 625 | ||
| 641 | ret = (long) peer_b->len; | 626 | ret = (long) peer_b->len; |
| 642 | } | 627 | } else |
| 643 | else | ||
| 644 | ret = 0; | 628 | ret = 0; |
| 645 | break; | 629 | break; |
| 646 | 630 | ||
| @@ -654,16 +638,16 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 654 | case BIO_CTRL_DUP: | 638 | case BIO_CTRL_DUP: |
| 655 | /* See BIO_dup_chain for circumstances we have to expect. */ | 639 | /* See BIO_dup_chain for circumstances we have to expect. */ |
| 656 | { | 640 | { |
| 657 | BIO *other_bio = ptr; | 641 | BIO *other_bio = ptr; |
| 658 | struct bio_bio_st *other_b; | 642 | struct bio_bio_st *other_b; |
| 659 | 643 | ||
| 660 | assert(other_bio != NULL); | 644 | assert(other_bio != NULL); |
| 661 | other_b = other_bio->ptr; | 645 | other_b = other_bio->ptr; |
| 662 | assert(other_b != NULL); | 646 | assert(other_b != NULL); |
| 663 | 647 | ||
| 664 | assert(other_b->buf == NULL); /* other_bio is always fresh */ | 648 | assert(other_b->buf == NULL); /* other_bio is always fresh */ |
| 665 | 649 | ||
| 666 | other_b->size = b->size; | 650 | other_b->size = b->size; |
| 667 | } | 651 | } |
| 668 | 652 | ||
| 669 | ret = 1; | 653 | ret = 1; |
| @@ -675,34 +659,34 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr) | |||
| 675 | 659 | ||
| 676 | case BIO_CTRL_EOF: | 660 | case BIO_CTRL_EOF: |
| 677 | { | 661 | { |
| 678 | BIO *other_bio = ptr; | 662 | BIO *other_bio = ptr; |
| 679 | 663 | ||
| 680 | if (other_bio) | 664 | if (other_bio) { |
| 681 | { | 665 | struct bio_bio_st *other_b = other_bio->ptr; |
| 682 | struct bio_bio_st *other_b = other_bio->ptr; | 666 | |
| 683 | 667 | assert(other_b != NULL); | |
| 684 | assert(other_b != NULL); | 668 | ret = other_b->len == 0 && other_b->closed; |
| 685 | ret = other_b->len == 0 && other_b->closed; | 669 | } else |
| 686 | } | 670 | ret = 1; |
| 687 | else | ||
| 688 | ret = 1; | ||
| 689 | } | 671 | } |
| 690 | break; | 672 | break; |
| 691 | 673 | ||
| 692 | default: | 674 | default: |
| 693 | ret = 0; | 675 | ret = 0; |
| 694 | } | ||
| 695 | return ret; | ||
| 696 | } | 676 | } |
| 677 | return ret; | ||
| 678 | } | ||
| 697 | 679 | ||
| 698 | static int bio_puts(BIO *bio, const char *str) | 680 | static int |
| 699 | { | 681 | bio_puts(BIO *bio, const char *str) |
| 682 | { | ||
| 700 | return bio_write(bio, str, strlen(str)); | 683 | return bio_write(bio, str, strlen(str)); |
| 701 | } | 684 | } |
| 702 | 685 | ||
| 703 | 686 | ||
| 704 | static int bio_make_pair(BIO *bio1, BIO *bio2) | 687 | static int |
| 705 | { | 688 | bio_make_pair(BIO *bio1, BIO *bio2) |
| 689 | { | ||
| 706 | struct bio_bio_st *b1, *b2; | 690 | struct bio_bio_st *b1, *b2; |
| 707 | 691 | ||
| 708 | assert(bio1 != NULL); | 692 | assert(bio1 != NULL); |
| @@ -710,37 +694,32 @@ static int bio_make_pair(BIO *bio1, BIO *bio2) | |||
| 710 | 694 | ||
| 711 | b1 = bio1->ptr; | 695 | b1 = bio1->ptr; |
| 712 | b2 = bio2->ptr; | 696 | b2 = bio2->ptr; |
| 713 | 697 | ||
| 714 | if (b1->peer != NULL || b2->peer != NULL) | 698 | if (b1->peer != NULL || b2->peer != NULL) { |
| 715 | { | ||
| 716 | BIOerr(BIO_F_BIO_MAKE_PAIR, BIO_R_IN_USE); | 699 | BIOerr(BIO_F_BIO_MAKE_PAIR, BIO_R_IN_USE); |
| 717 | return 0; | 700 | return 0; |
| 718 | } | 701 | } |
| 719 | 702 | ||
| 720 | if (b1->buf == NULL) | 703 | if (b1->buf == NULL) { |
| 721 | { | ||
| 722 | b1->buf = OPENSSL_malloc(b1->size); | 704 | b1->buf = OPENSSL_malloc(b1->size); |
| 723 | if (b1->buf == NULL) | 705 | if (b1->buf == NULL) { |
| 724 | { | ||
| 725 | BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); | 706 | BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); |
| 726 | return 0; | 707 | return 0; |
| 727 | } | 708 | } |
| 728 | b1->len = 0; | 709 | b1->len = 0; |
| 729 | b1->offset = 0; | 710 | b1->offset = 0; |
| 730 | } | 711 | } |
| 731 | 712 | ||
| 732 | if (b2->buf == NULL) | 713 | if (b2->buf == NULL) { |
| 733 | { | ||
| 734 | b2->buf = OPENSSL_malloc(b2->size); | 714 | b2->buf = OPENSSL_malloc(b2->size); |
| 735 | if (b2->buf == NULL) | 715 | if (b2->buf == NULL) { |
| 736 | { | ||
| 737 | BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); | 716 | BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE); |
| 738 | return 0; | 717 | return 0; |
| 739 | } | 718 | } |
| 740 | b2->len = 0; | 719 | b2->len = 0; |
| 741 | b2->offset = 0; | 720 | b2->offset = 0; |
| 742 | } | 721 | } |
| 743 | 722 | ||
| 744 | b1->peer = bio2; | 723 | b1->peer = bio2; |
| 745 | b1->closed = 0; | 724 | b1->closed = 0; |
| 746 | b1->request = 0; | 725 | b1->request = 0; |
| @@ -752,18 +731,17 @@ static int bio_make_pair(BIO *bio1, BIO *bio2) | |||
| 752 | bio2->init = 1; | 731 | bio2->init = 1; |
| 753 | 732 | ||
| 754 | return 1; | 733 | return 1; |
| 755 | } | 734 | } |
| 756 | 735 | ||
| 757 | static void bio_destroy_pair(BIO *bio) | 736 | static void |
| 758 | { | 737 | bio_destroy_pair(BIO *bio) |
| 738 | { | ||
| 759 | struct bio_bio_st *b = bio->ptr; | 739 | struct bio_bio_st *b = bio->ptr; |
| 760 | 740 | ||
| 761 | if (b != NULL) | 741 | if (b != NULL) { |
| 762 | { | ||
| 763 | BIO *peer_bio = b->peer; | 742 | BIO *peer_bio = b->peer; |
| 764 | 743 | ||
| 765 | if (peer_bio != NULL) | 744 | if (peer_bio != NULL) { |
| 766 | { | ||
| 767 | struct bio_bio_st *peer_b = peer_bio->ptr; | 745 | struct bio_bio_st *peer_b = peer_bio->ptr; |
| 768 | 746 | ||
| 769 | assert(peer_b != NULL); | 747 | assert(peer_b != NULL); |
| @@ -774,151 +752,149 @@ static void bio_destroy_pair(BIO *bio) | |||
| 774 | assert(peer_b->buf != NULL); | 752 | assert(peer_b->buf != NULL); |
| 775 | peer_b->len = 0; | 753 | peer_b->len = 0; |
| 776 | peer_b->offset = 0; | 754 | peer_b->offset = 0; |
| 777 | 755 | ||
| 778 | b->peer = NULL; | 756 | b->peer = NULL; |
| 779 | bio->init = 0; | 757 | bio->init = 0; |
| 780 | assert(b->buf != NULL); | 758 | assert(b->buf != NULL); |
| 781 | b->len = 0; | 759 | b->len = 0; |
| 782 | b->offset = 0; | 760 | b->offset = 0; |
| 783 | } | ||
| 784 | } | 761 | } |
| 785 | } | 762 | } |
| 786 | 763 | } | |
| 764 | |||
| 787 | 765 | ||
| 788 | /* Exported convenience functions */ | 766 | /* Exported convenience functions */ |
| 789 | int BIO_new_bio_pair(BIO **bio1_p, size_t writebuf1, | 767 | int |
| 790 | BIO **bio2_p, size_t writebuf2) | 768 | BIO_new_bio_pair(BIO **bio1_p, size_t writebuf1, BIO **bio2_p, size_t writebuf2) |
| 791 | { | 769 | { |
| 792 | BIO *bio1 = NULL, *bio2 = NULL; | 770 | BIO *bio1 = NULL, *bio2 = NULL; |
| 793 | long r; | 771 | long r; |
| 794 | int ret = 0; | 772 | int ret = 0; |
| 795 | 773 | ||
| 796 | bio1 = BIO_new(BIO_s_bio()); | 774 | bio1 = BIO_new(BIO_s_bio()); |
| 797 | if (bio1 == NULL) | 775 | if (bio1 == NULL) |
| 798 | goto err; | 776 | goto err; |
| 799 | bio2 = BIO_new(BIO_s_bio()); | 777 | bio2 = BIO_new(BIO_s_bio()); |
| 800 | if (bio2 == NULL) | 778 | if (bio2 == NULL) |
| 801 | goto err; | 779 | goto err; |
| 802 | 780 | ||
| 803 | if (writebuf1) | 781 | if (writebuf1) { |
| 804 | { | 782 | r = BIO_set_write_buf_size(bio1, writebuf1); |
| 805 | r = BIO_set_write_buf_size(bio1, writebuf1); | 783 | if (!r) |
| 806 | if (!r) | 784 | goto err; |
| 807 | goto err; | 785 | } |
| 808 | } | 786 | if (writebuf2) { |
| 809 | if (writebuf2) | 787 | r = BIO_set_write_buf_size(bio2, writebuf2); |
| 810 | { | 788 | if (!r) |
| 811 | r = BIO_set_write_buf_size(bio2, writebuf2); | 789 | goto err; |
| 812 | if (!r) | ||
| 813 | goto err; | ||
| 814 | } | ||
| 815 | |||
| 816 | r = BIO_make_bio_pair(bio1, bio2); | ||
| 817 | if (!r) | ||
| 818 | goto err; | ||
| 819 | ret = 1; | ||
| 820 | |||
| 821 | err: | ||
| 822 | if (ret == 0) | ||
| 823 | { | ||
| 824 | if (bio1) | ||
| 825 | { | ||
| 826 | BIO_free(bio1); | ||
| 827 | bio1 = NULL; | ||
| 828 | } | ||
| 829 | if (bio2) | ||
| 830 | { | ||
| 831 | BIO_free(bio2); | ||
| 832 | bio2 = NULL; | ||
| 833 | } | ||
| 834 | } | ||
| 835 | |||
| 836 | *bio1_p = bio1; | ||
| 837 | *bio2_p = bio2; | ||
| 838 | return ret; | ||
| 839 | } | ||
| 840 | |||
| 841 | size_t BIO_ctrl_get_write_guarantee(BIO *bio) | ||
| 842 | { | ||
| 843 | return BIO_ctrl(bio, BIO_C_GET_WRITE_GUARANTEE, 0, NULL); | ||
| 844 | } | 790 | } |
| 845 | 791 | ||
| 846 | size_t BIO_ctrl_get_read_request(BIO *bio) | 792 | r = BIO_make_bio_pair(bio1, bio2); |
| 847 | { | 793 | if (!r) |
| 848 | return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, NULL); | 794 | goto err; |
| 795 | ret = 1; | ||
| 796 | |||
| 797 | err: | ||
| 798 | if (ret == 0) { | ||
| 799 | if (bio1) { | ||
| 800 | BIO_free(bio1); | ||
| 801 | bio1 = NULL; | ||
| 802 | } | ||
| 803 | if (bio2) { | ||
| 804 | BIO_free(bio2); | ||
| 805 | bio2 = NULL; | ||
| 806 | } | ||
| 849 | } | 807 | } |
| 850 | 808 | ||
| 851 | int BIO_ctrl_reset_read_request(BIO *bio) | 809 | *bio1_p = bio1; |
| 852 | { | 810 | *bio2_p = bio2; |
| 811 | return ret; | ||
| 812 | } | ||
| 813 | |||
| 814 | size_t | ||
| 815 | BIO_ctrl_get_write_guarantee(BIO *bio) | ||
| 816 | { | ||
| 817 | return BIO_ctrl(bio, BIO_C_GET_WRITE_GUARANTEE, 0, NULL); | ||
| 818 | } | ||
| 819 | |||
| 820 | size_t | ||
| 821 | BIO_ctrl_get_read_request(BIO *bio) | ||
| 822 | { | ||
| 823 | return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, NULL); | ||
| 824 | } | ||
| 825 | |||
| 826 | int | ||
| 827 | BIO_ctrl_reset_read_request(BIO *bio) | ||
| 828 | { | ||
| 853 | return (BIO_ctrl(bio, BIO_C_RESET_READ_REQUEST, 0, NULL) != 0); | 829 | return (BIO_ctrl(bio, BIO_C_RESET_READ_REQUEST, 0, NULL) != 0); |
| 854 | } | 830 | } |
| 855 | 831 | ||
| 856 | 832 | ||
| 857 | /* BIO_nread0/nread/nwrite0/nwrite are available only for BIO pairs for now | 833 | /* BIO_nread0/nread/nwrite0/nwrite are available only for BIO pairs for now |
| 858 | * (conceivably some other BIOs could allow non-copying reads and writes too.) | 834 | * (conceivably some other BIOs could allow non-copying reads and writes too.) |
| 859 | */ | 835 | */ |
| 860 | int BIO_nread0(BIO *bio, char **buf) | 836 | int |
| 861 | { | 837 | BIO_nread0(BIO *bio, char **buf) |
| 838 | { | ||
| 862 | long ret; | 839 | long ret; |
| 863 | 840 | ||
| 864 | if (!bio->init) | 841 | if (!bio->init) { |
| 865 | { | ||
| 866 | BIOerr(BIO_F_BIO_NREAD0, BIO_R_UNINITIALIZED); | 842 | BIOerr(BIO_F_BIO_NREAD0, BIO_R_UNINITIALIZED); |
| 867 | return -2; | 843 | return -2; |
| 868 | } | 844 | } |
| 869 | 845 | ||
| 870 | ret = BIO_ctrl(bio, BIO_C_NREAD0, 0, buf); | 846 | ret = BIO_ctrl(bio, BIO_C_NREAD0, 0, buf); |
| 871 | if (ret > INT_MAX) | 847 | if (ret > INT_MAX) |
| 872 | return INT_MAX; | 848 | return INT_MAX; |
| 873 | else | 849 | else |
| 874 | return (int) ret; | 850 | return (int) ret; |
| 875 | } | 851 | } |
| 876 | 852 | ||
| 877 | int BIO_nread(BIO *bio, char **buf, int num) | 853 | int |
| 878 | { | 854 | BIO_nread(BIO *bio, char **buf, int num) |
| 855 | { | ||
| 879 | int ret; | 856 | int ret; |
| 880 | 857 | ||
| 881 | if (!bio->init) | 858 | if (!bio->init) { |
| 882 | { | ||
| 883 | BIOerr(BIO_F_BIO_NREAD, BIO_R_UNINITIALIZED); | 859 | BIOerr(BIO_F_BIO_NREAD, BIO_R_UNINITIALIZED); |
| 884 | return -2; | 860 | return -2; |
| 885 | } | 861 | } |
| 886 | 862 | ||
| 887 | ret = (int) BIO_ctrl(bio, BIO_C_NREAD, num, buf); | 863 | ret = (int) BIO_ctrl(bio, BIO_C_NREAD, num, buf); |
| 888 | if (ret > 0) | 864 | if (ret > 0) |
| 889 | bio->num_read += ret; | 865 | bio->num_read += ret; |
| 890 | return ret; | 866 | return ret; |
| 891 | } | 867 | } |
| 892 | 868 | ||
| 893 | int BIO_nwrite0(BIO *bio, char **buf) | 869 | int |
| 894 | { | 870 | BIO_nwrite0(BIO *bio, char **buf) |
| 871 | { | ||
| 895 | long ret; | 872 | long ret; |
| 896 | 873 | ||
| 897 | if (!bio->init) | 874 | if (!bio->init) { |
| 898 | { | ||
| 899 | BIOerr(BIO_F_BIO_NWRITE0, BIO_R_UNINITIALIZED); | 875 | BIOerr(BIO_F_BIO_NWRITE0, BIO_R_UNINITIALIZED); |
| 900 | return -2; | 876 | return -2; |
| 901 | } | 877 | } |
| 902 | 878 | ||
| 903 | ret = BIO_ctrl(bio, BIO_C_NWRITE0, 0, buf); | 879 | ret = BIO_ctrl(bio, BIO_C_NWRITE0, 0, buf); |
| 904 | if (ret > INT_MAX) | 880 | if (ret > INT_MAX) |
| 905 | return INT_MAX; | 881 | return INT_MAX; |
| 906 | else | 882 | else |
| 907 | return (int) ret; | 883 | return (int) ret; |
| 908 | } | 884 | } |
| 909 | 885 | ||
| 910 | int BIO_nwrite(BIO *bio, char **buf, int num) | 886 | int |
| 911 | { | 887 | BIO_nwrite(BIO *bio, char **buf, int num) |
| 888 | { | ||
| 912 | int ret; | 889 | int ret; |
| 913 | 890 | ||
| 914 | if (!bio->init) | 891 | if (!bio->init) { |
| 915 | { | ||
| 916 | BIOerr(BIO_F_BIO_NWRITE, BIO_R_UNINITIALIZED); | 892 | BIOerr(BIO_F_BIO_NWRITE, BIO_R_UNINITIALIZED); |
| 917 | return -2; | 893 | return -2; |
| 918 | } | 894 | } |
| 919 | 895 | ||
| 920 | ret = BIO_ctrl(bio, BIO_C_NWRITE, num, buf); | 896 | ret = BIO_ctrl(bio, BIO_C_NWRITE, num, buf); |
| 921 | if (ret > 0) | 897 | if (ret > 0) |
| 922 | bio->num_write += ret; | 898 | bio->num_write += ret; |
| 923 | return ret; | 899 | return ret; |
| 924 | } | 900 | } |
diff --git a/src/lib/libssl/src/crypto/bio/bss_conn.c b/src/lib/libssl/src/crypto/bio/bss_conn.c index 5162e75c87..df34c49a4a 100644 --- a/src/lib/libssl/src/crypto/bio/bss_conn.c +++ b/src/lib/libssl/src/crypto/bio/bss_conn.c | |||
| @@ -76,8 +76,7 @@ | |||
| 76 | #endif | 76 | #endif |
| 77 | 77 | ||
| 78 | 78 | ||
| 79 | typedef struct bio_connect_st | 79 | typedef struct bio_connect_st { |
| 80 | { | ||
| 81 | int state; | 80 | int state; |
| 82 | 81 | ||
| 83 | char *param_hostname; | 82 | char *param_hostname; |
| @@ -95,8 +94,8 @@ typedef struct bio_connect_st | |||
| 95 | /* called when the connection is initially made | 94 | /* called when the connection is initially made |
| 96 | * callback(BIO,state,ret); The callback should return | 95 | * callback(BIO,state,ret); The callback should return |
| 97 | * 'ret'. state is for compatibility with the ssl info_callback */ | 96 | * 'ret'. state is for compatibility with the ssl info_callback */ |
| 98 | int (*info_callback)(const BIO *bio,int state,int ret); | 97 | int (*info_callback)(const BIO *bio, int state, int ret); |
| 99 | } BIO_CONNECT; | 98 | } BIO_CONNECT; |
| 100 | 99 | ||
| 101 | static int conn_write(BIO *h, const char *buf, int num); | 100 | static int conn_write(BIO *h, const char *buf, int num); |
| 102 | static int conn_read(BIO *h, char *buf, int size); | 101 | static int conn_read(BIO *h, char *buf, int size); |
| @@ -108,11 +107,10 @@ static long conn_callback_ctrl(BIO *h, int cmd, bio_info_cb *); | |||
| 108 | 107 | ||
| 109 | static int conn_state(BIO *b, BIO_CONNECT *c); | 108 | static int conn_state(BIO *b, BIO_CONNECT *c); |
| 110 | static void conn_close_socket(BIO *data); | 109 | static void conn_close_socket(BIO *data); |
| 111 | BIO_CONNECT *BIO_CONNECT_new(void ); | 110 | BIO_CONNECT *BIO_CONNECT_new(void); |
| 112 | void BIO_CONNECT_free(BIO_CONNECT *a); | 111 | void BIO_CONNECT_free(BIO_CONNECT *a); |
| 113 | 112 | ||
| 114 | static BIO_METHOD methods_connectp= | 113 | static BIO_METHOD methods_connectp = { |
| 115 | { | ||
| 116 | BIO_TYPE_CONNECT, | 114 | BIO_TYPE_CONNECT, |
| 117 | "socket connect", | 115 | "socket connect", |
| 118 | conn_write, | 116 | conn_write, |
| @@ -123,530 +121,501 @@ static BIO_METHOD methods_connectp= | |||
| 123 | conn_new, | 121 | conn_new, |
| 124 | conn_free, | 122 | conn_free, |
| 125 | conn_callback_ctrl, | 123 | conn_callback_ctrl, |
| 126 | }; | 124 | }; |
| 127 | 125 | ||
| 128 | static int conn_state(BIO *b, BIO_CONNECT *c) | 126 | static int |
| 129 | { | 127 | conn_state(BIO *b, BIO_CONNECT *c) |
| 130 | int ret= -1,i; | 128 | { |
| 129 | int ret = -1, i; | ||
| 131 | unsigned long l; | 130 | unsigned long l; |
| 132 | char *p,*q; | 131 | char *p, *q; |
| 133 | int (*cb)(const BIO *,int,int)=NULL; | 132 | int (*cb)(const BIO *, int, int) = NULL; |
| 134 | 133 | ||
| 135 | if (c->info_callback != NULL) | 134 | if (c->info_callback != NULL) |
| 136 | cb=c->info_callback; | 135 | cb = c->info_callback; |
| 137 | 136 | ||
| 138 | for (;;) | 137 | for (;;) { |
| 139 | { | 138 | switch (c->state) { |
| 140 | switch (c->state) | ||
| 141 | { | ||
| 142 | case BIO_CONN_S_BEFORE: | 139 | case BIO_CONN_S_BEFORE: |
| 143 | p=c->param_hostname; | 140 | p = c->param_hostname; |
| 144 | if (p == NULL) | 141 | if (p == NULL) { |
| 145 | { | 142 | BIOerr(BIO_F_CONN_STATE, BIO_R_NO_HOSTNAME_SPECIFIED); |
| 146 | BIOerr(BIO_F_CONN_STATE,BIO_R_NO_HOSTNAME_SPECIFIED); | ||
| 147 | goto exit_loop; | 143 | goto exit_loop; |
| 148 | } | 144 | } |
| 149 | for ( ; *p != '\0'; p++) | 145 | for (; *p != '\0'; p++) { |
| 150 | { | 146 | if ((*p == ':') || (*p == '/')) |
| 151 | if ((*p == ':') || (*p == '/')) break; | 147 | break; |
| 152 | } | 148 | } |
| 153 | 149 | ||
| 154 | i= *p; | 150 | i= *p; |
| 155 | if ((i == ':') || (i == '/')) | 151 | if ((i == ':') || (i == '/')) { |
| 156 | { | 152 | *(p++) = '\0'; |
| 157 | 153 | if (i == ':') { | |
| 158 | *(p++)='\0'; | 154 | for (q = p; *q; q++) |
| 159 | if (i == ':') | 155 | if (*q == '/') { |
| 160 | { | 156 | *q = '\0'; |
| 161 | for (q=p; *q; q++) | ||
| 162 | if (*q == '/') | ||
| 163 | { | ||
| 164 | *q='\0'; | ||
| 165 | break; | 157 | break; |
| 166 | } | 158 | } |
| 167 | if (c->param_port != NULL) | 159 | if (c->param_port != NULL) |
| 168 | OPENSSL_free(c->param_port); | 160 | OPENSSL_free(c->param_port); |
| 169 | c->param_port=BUF_strdup(p); | 161 | c->param_port = BUF_strdup(p); |
| 170 | } | ||
| 171 | } | 162 | } |
| 163 | } | ||
| 172 | 164 | ||
| 173 | if (c->param_port == NULL) | 165 | if (c->param_port == NULL) { |
| 174 | { | 166 | BIOerr(BIO_F_CONN_STATE, BIO_R_NO_PORT_SPECIFIED); |
| 175 | BIOerr(BIO_F_CONN_STATE,BIO_R_NO_PORT_SPECIFIED); | 167 | ERR_add_error_data(2, "host=", c->param_hostname); |
| 176 | ERR_add_error_data(2,"host=",c->param_hostname); | ||
| 177 | goto exit_loop; | 168 | goto exit_loop; |
| 178 | } | 169 | } |
| 179 | c->state=BIO_CONN_S_GET_IP; | 170 | c->state = BIO_CONN_S_GET_IP; |
| 180 | break; | 171 | break; |
| 181 | 172 | ||
| 182 | case BIO_CONN_S_GET_IP: | 173 | case BIO_CONN_S_GET_IP: |
| 183 | if (BIO_get_host_ip(c->param_hostname,&(c->ip[0])) <= 0) | 174 | if (BIO_get_host_ip(c->param_hostname, &(c->ip[0])) <= 0) |
| 184 | goto exit_loop; | 175 | goto exit_loop; |
| 185 | c->state=BIO_CONN_S_GET_PORT; | 176 | c->state = BIO_CONN_S_GET_PORT; |
| 186 | break; | 177 | break; |
| 187 | 178 | ||
| 188 | case BIO_CONN_S_GET_PORT: | 179 | case BIO_CONN_S_GET_PORT: |
| 189 | if (c->param_port == NULL) | 180 | if (c->param_port == NULL) { |
| 190 | { | ||
| 191 | /* abort(); */ | 181 | /* abort(); */ |
| 192 | goto exit_loop; | 182 | goto exit_loop; |
| 193 | } | 183 | } else if (BIO_get_port(c->param_port, &c->port) <= 0) |
| 194 | else if (BIO_get_port(c->param_port,&c->port) <= 0) | ||
| 195 | goto exit_loop; | 184 | goto exit_loop; |
| 196 | c->state=BIO_CONN_S_CREATE_SOCKET; | 185 | c->state = BIO_CONN_S_CREATE_SOCKET; |
| 197 | break; | 186 | break; |
| 198 | 187 | ||
| 199 | case BIO_CONN_S_CREATE_SOCKET: | 188 | case BIO_CONN_S_CREATE_SOCKET: |
| 200 | /* now setup address */ | 189 | /* now setup address */ |
| 201 | memset((char *)&c->them,0,sizeof(c->them)); | 190 | memset((char *)&c->them, 0, sizeof(c->them)); |
| 202 | c->them.sin_family=AF_INET; | 191 | c->them.sin_family = AF_INET; |
| 203 | c->them.sin_port=htons((unsigned short)c->port); | 192 | c->them.sin_port = htons((unsigned short)c->port); |
| 204 | l=(unsigned long) | 193 | l = (unsigned long) |
| 205 | ((unsigned long)c->ip[0]<<24L)| | 194 | ((unsigned long)c->ip[0] << 24L)| |
| 206 | ((unsigned long)c->ip[1]<<16L)| | 195 | ((unsigned long)c->ip[1] << 16L)| |
| 207 | ((unsigned long)c->ip[2]<< 8L)| | 196 | ((unsigned long)c->ip[2] << 8L)| |
| 208 | ((unsigned long)c->ip[3]); | 197 | ((unsigned long)c->ip[3]); |
| 209 | c->them.sin_addr.s_addr=htonl(l); | 198 | c->them.sin_addr.s_addr = htonl(l); |
| 210 | c->state=BIO_CONN_S_CREATE_SOCKET; | 199 | c->state = BIO_CONN_S_CREATE_SOCKET; |
| 211 | 200 | ||
| 212 | ret=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); | 201 | ret = socket(AF_INET, SOCK_STREAM, SOCKET_PROTOCOL); |
| 213 | if (ret == -1) | 202 | if (ret == -1) { |
| 214 | { | 203 | SYSerr(SYS_F_SOCKET, errno); |
| 215 | SYSerr(SYS_F_SOCKET,errno); | 204 | ERR_add_error_data(4, "host=", |
| 216 | ERR_add_error_data(4,"host=",c->param_hostname, | 205 | c->param_hostname, ":", c->param_port); |
| 217 | ":",c->param_port); | 206 | BIOerr(BIO_F_CONN_STATE, |
| 218 | BIOerr(BIO_F_CONN_STATE,BIO_R_UNABLE_TO_CREATE_SOCKET); | 207 | BIO_R_UNABLE_TO_CREATE_SOCKET); |
| 219 | goto exit_loop; | 208 | goto exit_loop; |
| 220 | } | 209 | } |
| 221 | b->num=ret; | 210 | b->num = ret; |
| 222 | c->state=BIO_CONN_S_NBIO; | 211 | c->state = BIO_CONN_S_NBIO; |
| 223 | break; | 212 | break; |
| 224 | 213 | ||
| 225 | case BIO_CONN_S_NBIO: | 214 | case BIO_CONN_S_NBIO: |
| 226 | if (c->nbio) | 215 | if (c->nbio) { |
| 227 | { | 216 | if (!BIO_socket_nbio(b->num, 1)) { |
| 228 | if (!BIO_socket_nbio(b->num,1)) | 217 | BIOerr(BIO_F_CONN_STATE, |
| 229 | { | 218 | BIO_R_ERROR_SETTING_NBIO); |
| 230 | BIOerr(BIO_F_CONN_STATE,BIO_R_ERROR_SETTING_NBIO); | 219 | ERR_add_error_data(4, "host=", |
| 231 | ERR_add_error_data(4,"host=", | 220 | c->param_hostname, ":", |
| 232 | c->param_hostname, | 221 | c->param_port); |
| 233 | ":",c->param_port); | ||
| 234 | goto exit_loop; | 222 | goto exit_loop; |
| 235 | } | ||
| 236 | } | 223 | } |
| 237 | c->state=BIO_CONN_S_CONNECT; | 224 | } |
| 225 | c->state = BIO_CONN_S_CONNECT; | ||
| 238 | 226 | ||
| 239 | #if defined(SO_KEEPALIVE) && !defined(OPENSSL_SYS_MPE) | 227 | #if defined(SO_KEEPALIVE) && !defined(OPENSSL_SYS_MPE) |
| 240 | i=1; | 228 | i = 1; |
| 241 | i=setsockopt(b->num,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); | 229 | i = setsockopt(b->num, SOL_SOCKET, SO_KEEPALIVE,(char *)&i, sizeof(i)); |
| 242 | if (i < 0) | 230 | if (i < 0) { |
| 243 | { | 231 | SYSerr(SYS_F_SOCKET, errno); |
| 244 | SYSerr(SYS_F_SOCKET,errno); | 232 | ERR_add_error_data(4, "host=", |
| 245 | ERR_add_error_data(4,"host=",c->param_hostname, | 233 | c->param_hostname, ":", c->param_port); |
| 246 | ":",c->param_port); | 234 | BIOerr(BIO_F_CONN_STATE, BIO_R_KEEPALIVE); |
| 247 | BIOerr(BIO_F_CONN_STATE,BIO_R_KEEPALIVE); | ||
| 248 | goto exit_loop; | 235 | goto exit_loop; |
| 249 | } | 236 | } |
| 250 | #endif | 237 | #endif |
| 251 | break; | 238 | break; |
| 252 | 239 | ||
| 253 | case BIO_CONN_S_CONNECT: | 240 | case BIO_CONN_S_CONNECT: |
| 254 | BIO_clear_retry_flags(b); | 241 | BIO_clear_retry_flags(b); |
| 255 | ret=connect(b->num, | 242 | ret = connect(b->num, |
| 256 | (struct sockaddr *)&c->them, | 243 | (struct sockaddr *)&c->them, |
| 257 | sizeof(c->them)); | 244 | sizeof(c->them)); |
| 258 | b->retry_reason=0; | 245 | b->retry_reason = 0; |
| 259 | if (ret < 0) | 246 | if (ret < 0) { |
| 260 | { | 247 | if (BIO_sock_should_retry(ret)) { |
| 261 | if (BIO_sock_should_retry(ret)) | ||
| 262 | { | ||
| 263 | BIO_set_retry_special(b); | 248 | BIO_set_retry_special(b); |
| 264 | c->state=BIO_CONN_S_BLOCKED_CONNECT; | 249 | c->state = BIO_CONN_S_BLOCKED_CONNECT; |
| 265 | b->retry_reason=BIO_RR_CONNECT; | 250 | b->retry_reason = BIO_RR_CONNECT; |
| 266 | } | 251 | } else { |
| 267 | else | 252 | SYSerr(SYS_F_CONNECT, errno); |
| 268 | { | 253 | ERR_add_error_data(4, "host=", |
| 269 | SYSerr(SYS_F_CONNECT,errno); | 254 | c->param_hostname, ":", |
| 270 | ERR_add_error_data(4,"host=", | 255 | c->param_port); |
| 271 | c->param_hostname, | 256 | BIOerr(BIO_F_CONN_STATE, |
| 272 | ":",c->param_port); | 257 | BIO_R_CONNECT_ERROR); |
| 273 | BIOerr(BIO_F_CONN_STATE,BIO_R_CONNECT_ERROR); | ||
| 274 | } | ||
| 275 | goto exit_loop; | ||
| 276 | } | 258 | } |
| 277 | else | 259 | goto exit_loop; |
| 278 | c->state=BIO_CONN_S_OK; | 260 | } else |
| 261 | c->state = BIO_CONN_S_OK; | ||
| 279 | break; | 262 | break; |
| 280 | 263 | ||
| 281 | case BIO_CONN_S_BLOCKED_CONNECT: | 264 | case BIO_CONN_S_BLOCKED_CONNECT: |
| 282 | i=BIO_sock_error(b->num); | 265 | i = BIO_sock_error(b->num); |
| 283 | if (i) | 266 | if (i) { |
| 284 | { | ||
| 285 | BIO_clear_retry_flags(b); | 267 | BIO_clear_retry_flags(b); |
| 286 | SYSerr(SYS_F_CONNECT,i); | 268 | SYSerr(SYS_F_CONNECT, i); |
| 287 | ERR_add_error_data(4,"host=", | 269 | ERR_add_error_data(4, "host=", |
| 288 | c->param_hostname, | 270 | c->param_hostname, ":", c->param_port); |
| 289 | ":",c->param_port); | 271 | BIOerr(BIO_F_CONN_STATE, |
| 290 | BIOerr(BIO_F_CONN_STATE,BIO_R_NBIO_CONNECT_ERROR); | 272 | BIO_R_NBIO_CONNECT_ERROR); |
| 291 | ret=0; | 273 | ret = 0; |
| 292 | goto exit_loop; | 274 | goto exit_loop; |
| 293 | } | 275 | } else |
| 294 | else | 276 | c->state = BIO_CONN_S_OK; |
| 295 | c->state=BIO_CONN_S_OK; | ||
| 296 | break; | 277 | break; |
| 297 | 278 | ||
| 298 | case BIO_CONN_S_OK: | 279 | case BIO_CONN_S_OK: |
| 299 | ret=1; | 280 | ret = 1; |
| 300 | goto exit_loop; | 281 | goto exit_loop; |
| 301 | default: | 282 | default: |
| 302 | /* abort(); */ | 283 | /* abort(); */ |
| 303 | goto exit_loop; | 284 | goto exit_loop; |
| 304 | } | 285 | } |
| 305 | 286 | ||
| 306 | if (cb != NULL) | 287 | if (cb != NULL) { |
| 307 | { | 288 | if (!(ret = cb((BIO *)b, c->state, ret))) |
| 308 | if (!(ret=cb((BIO *)b,c->state,ret))) | ||
| 309 | goto end; | 289 | goto end; |
| 310 | } | ||
| 311 | } | 290 | } |
| 291 | } | ||
| 312 | 292 | ||
| 313 | /* Loop does not exit */ | 293 | /* Loop does not exit */ |
| 314 | exit_loop: | 294 | exit_loop: |
| 315 | if (cb != NULL) | 295 | if (cb != NULL) |
| 316 | ret=cb((BIO *)b,c->state,ret); | 296 | ret = cb((BIO *)b, c->state, ret); |
| 317 | end: | 297 | end: |
| 318 | return(ret); | 298 | return (ret); |
| 319 | } | 299 | } |
| 320 | 300 | ||
| 321 | BIO_CONNECT *BIO_CONNECT_new(void) | 301 | BIO_CONNECT |
| 322 | { | 302 | *BIO_CONNECT_new(void) |
| 303 | { | ||
| 323 | BIO_CONNECT *ret; | 304 | BIO_CONNECT *ret; |
| 324 | 305 | ||
| 325 | if ((ret=(BIO_CONNECT *)OPENSSL_malloc(sizeof(BIO_CONNECT))) == NULL) | 306 | if ((ret = (BIO_CONNECT *)OPENSSL_malloc(sizeof(BIO_CONNECT))) == NULL) |
| 326 | return(NULL); | 307 | return (NULL); |
| 327 | ret->state=BIO_CONN_S_BEFORE; | 308 | ret->state = BIO_CONN_S_BEFORE; |
| 328 | ret->param_hostname=NULL; | 309 | ret->param_hostname = NULL; |
| 329 | ret->param_port=NULL; | 310 | ret->param_port = NULL; |
| 330 | ret->info_callback=NULL; | 311 | ret->info_callback = NULL; |
| 331 | ret->nbio=0; | 312 | ret->nbio = 0; |
| 332 | ret->ip[0]=0; | 313 | ret->ip[0] = 0; |
| 333 | ret->ip[1]=0; | 314 | ret->ip[1] = 0; |
| 334 | ret->ip[2]=0; | 315 | ret->ip[2] = 0; |
| 335 | ret->ip[3]=0; | 316 | ret->ip[3] = 0; |
| 336 | ret->port=0; | 317 | ret->port = 0; |
| 337 | memset((char *)&ret->them,0,sizeof(ret->them)); | 318 | memset((char *)&ret->them, 0, sizeof(ret->them)); |
| 338 | return(ret); | 319 | return (ret); |
| 339 | } | 320 | } |
| 340 | 321 | ||
| 341 | void BIO_CONNECT_free(BIO_CONNECT *a) | 322 | void |
| 342 | { | 323 | BIO_CONNECT_free(BIO_CONNECT *a) |
| 343 | if(a == NULL) | 324 | { |
| 344 | return; | 325 | if (a == NULL) |
| 326 | return; | ||
| 345 | 327 | ||
| 346 | if (a->param_hostname != NULL) | 328 | if (a->param_hostname != NULL) |
| 347 | OPENSSL_free(a->param_hostname); | 329 | OPENSSL_free(a->param_hostname); |
| 348 | if (a->param_port != NULL) | 330 | if (a->param_port != NULL) |
| 349 | OPENSSL_free(a->param_port); | 331 | OPENSSL_free(a->param_port); |
| 350 | OPENSSL_free(a); | 332 | OPENSSL_free(a); |
| 351 | } | 333 | } |
| 352 | 334 | ||
| 353 | BIO_METHOD *BIO_s_connect(void) | 335 | BIO_METHOD |
| 354 | { | 336 | *BIO_s_connect(void) |
| 355 | return(&methods_connectp); | 337 | { |
| 356 | } | 338 | return (&methods_connectp); |
| 357 | 339 | } | |
| 358 | static int conn_new(BIO *bi) | 340 | |
| 359 | { | 341 | static int |
| 360 | bi->init=0; | 342 | conn_new(BIO *bi) |
| 361 | bi->num=-1; | 343 | { |
| 362 | bi->flags=0; | 344 | bi->init = 0; |
| 363 | if ((bi->ptr=(char *)BIO_CONNECT_new()) == NULL) | 345 | bi->num = -1; |
| 364 | return(0); | 346 | bi->flags = 0; |
| 347 | if ((bi->ptr = (char *)BIO_CONNECT_new()) == NULL) | ||
| 348 | return (0); | ||
| 365 | else | 349 | else |
| 366 | return(1); | 350 | return (1); |
| 367 | } | 351 | } |
| 368 | 352 | ||
| 369 | static void conn_close_socket(BIO *bio) | 353 | static void |
| 370 | { | 354 | conn_close_socket(BIO *bio) |
| 355 | { | ||
| 371 | BIO_CONNECT *c; | 356 | BIO_CONNECT *c; |
| 372 | 357 | ||
| 373 | c=(BIO_CONNECT *)bio->ptr; | 358 | c = (BIO_CONNECT *)bio->ptr; |
| 374 | if (bio->num != -1) | 359 | if (bio->num != -1) { |
| 375 | { | ||
| 376 | /* Only do a shutdown if things were established */ | 360 | /* Only do a shutdown if things were established */ |
| 377 | if (c->state == BIO_CONN_S_OK) | 361 | if (c->state == BIO_CONN_S_OK) |
| 378 | shutdown(bio->num, SHUT_RDWR); | 362 | shutdown(bio->num, SHUT_RDWR); |
| 379 | close(bio->num); | 363 | close(bio->num); |
| 380 | bio->num=-1; | 364 | bio->num = -1; |
| 381 | } | ||
| 382 | } | 365 | } |
| 366 | } | ||
| 383 | 367 | ||
| 384 | static int conn_free(BIO *a) | 368 | static int |
| 385 | { | 369 | conn_free(BIO *a) |
| 370 | { | ||
| 386 | BIO_CONNECT *data; | 371 | BIO_CONNECT *data; |
| 387 | 372 | ||
| 388 | if (a == NULL) return(0); | 373 | if (a == NULL) |
| 389 | data=(BIO_CONNECT *)a->ptr; | 374 | return (0); |
| 390 | 375 | data = (BIO_CONNECT *)a->ptr; | |
| 391 | if (a->shutdown) | 376 | |
| 392 | { | 377 | if (a->shutdown) { |
| 393 | conn_close_socket(a); | 378 | conn_close_socket(a); |
| 394 | BIO_CONNECT_free(data); | 379 | BIO_CONNECT_free(data); |
| 395 | a->ptr=NULL; | 380 | a->ptr = NULL; |
| 396 | a->flags=0; | 381 | a->flags = 0; |
| 397 | a->init=0; | 382 | a->init = 0; |
| 398 | } | ||
| 399 | return(1); | ||
| 400 | } | 383 | } |
| 401 | 384 | return (1); | |
| 402 | static int conn_read(BIO *b, char *out, int outl) | 385 | } |
| 403 | { | 386 | |
| 404 | int ret=0; | 387 | static int |
| 388 | conn_read(BIO *b, char *out, int outl) | ||
| 389 | { | ||
| 390 | int ret = 0; | ||
| 405 | BIO_CONNECT *data; | 391 | BIO_CONNECT *data; |
| 406 | 392 | ||
| 407 | data=(BIO_CONNECT *)b->ptr; | 393 | data = (BIO_CONNECT *)b->ptr; |
| 408 | if (data->state != BIO_CONN_S_OK) | 394 | if (data->state != BIO_CONN_S_OK) { |
| 409 | { | 395 | ret = conn_state(b, data); |
| 410 | ret=conn_state(b,data); | ||
| 411 | if (ret <= 0) | 396 | if (ret <= 0) |
| 412 | return(ret); | 397 | return (ret); |
| 413 | } | 398 | } |
| 414 | 399 | ||
| 415 | if (out != NULL) | 400 | if (out != NULL) { |
| 416 | { | ||
| 417 | errno = 0; | 401 | errno = 0; |
| 418 | ret=read(b->num,out,outl); | 402 | ret = read(b->num, out, outl); |
| 419 | BIO_clear_retry_flags(b); | 403 | BIO_clear_retry_flags(b); |
| 420 | if (ret <= 0) | 404 | if (ret <= 0) { |
| 421 | { | ||
| 422 | if (BIO_sock_should_retry(ret)) | 405 | if (BIO_sock_should_retry(ret)) |
| 423 | BIO_set_retry_read(b); | 406 | BIO_set_retry_read(b); |
| 424 | } | ||
| 425 | } | 407 | } |
| 426 | return(ret); | ||
| 427 | } | 408 | } |
| 409 | return (ret); | ||
| 410 | } | ||
| 428 | 411 | ||
| 429 | static int conn_write(BIO *b, const char *in, int inl) | 412 | static int |
| 430 | { | 413 | conn_write(BIO *b, const char *in, int inl) |
| 414 | { | ||
| 431 | int ret; | 415 | int ret; |
| 432 | BIO_CONNECT *data; | 416 | BIO_CONNECT *data; |
| 433 | 417 | ||
| 434 | data=(BIO_CONNECT *)b->ptr; | 418 | data = (BIO_CONNECT *)b->ptr; |
| 435 | if (data->state != BIO_CONN_S_OK) | 419 | if (data->state != BIO_CONN_S_OK) { |
| 436 | { | 420 | ret = conn_state(b, data); |
| 437 | ret=conn_state(b,data); | 421 | if (ret <= 0) |
| 438 | if (ret <= 0) return(ret); | 422 | return (ret); |
| 439 | } | 423 | } |
| 440 | 424 | ||
| 441 | errno = 0; | 425 | errno = 0; |
| 442 | ret=write(b->num,in,inl); | 426 | ret = write(b->num, in, inl); |
| 443 | BIO_clear_retry_flags(b); | 427 | BIO_clear_retry_flags(b); |
| 444 | if (ret <= 0) | 428 | if (ret <= 0) { |
| 445 | { | ||
| 446 | if (BIO_sock_should_retry(ret)) | 429 | if (BIO_sock_should_retry(ret)) |
| 447 | BIO_set_retry_write(b); | 430 | BIO_set_retry_write(b); |
| 448 | } | ||
| 449 | return(ret); | ||
| 450 | } | 431 | } |
| 432 | return (ret); | ||
| 433 | } | ||
| 451 | 434 | ||
| 452 | static long conn_ctrl(BIO *b, int cmd, long num, void *ptr) | 435 | static long |
| 453 | { | 436 | conn_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 437 | { | ||
| 454 | BIO *dbio; | 438 | BIO *dbio; |
| 455 | int *ip; | 439 | int *ip; |
| 456 | const char **pptr; | 440 | const char **pptr; |
| 457 | long ret=1; | 441 | long ret = 1; |
| 458 | BIO_CONNECT *data; | 442 | BIO_CONNECT *data; |
| 459 | 443 | ||
| 460 | data=(BIO_CONNECT *)b->ptr; | 444 | data = (BIO_CONNECT *)b->ptr; |
| 461 | 445 | ||
| 462 | switch (cmd) | 446 | switch (cmd) { |
| 463 | { | ||
| 464 | case BIO_CTRL_RESET: | 447 | case BIO_CTRL_RESET: |
| 465 | ret=0; | 448 | ret = 0; |
| 466 | data->state=BIO_CONN_S_BEFORE; | 449 | data->state = BIO_CONN_S_BEFORE; |
| 467 | conn_close_socket(b); | 450 | conn_close_socket(b); |
| 468 | b->flags=0; | 451 | b->flags = 0; |
| 469 | break; | 452 | break; |
| 470 | case BIO_C_DO_STATE_MACHINE: | 453 | case BIO_C_DO_STATE_MACHINE: |
| 471 | /* use this one to start the connection */ | 454 | /* use this one to start the connection */ |
| 472 | if (data->state != BIO_CONN_S_OK) | 455 | if (data->state != BIO_CONN_S_OK) |
| 473 | ret=(long)conn_state(b,data); | 456 | ret = (long)conn_state(b, data); |
| 474 | else | 457 | else |
| 475 | ret=1; | 458 | ret = 1; |
| 476 | break; | 459 | break; |
| 477 | case BIO_C_GET_CONNECT: | 460 | case BIO_C_GET_CONNECT: |
| 478 | if (ptr != NULL) | 461 | if (ptr != NULL) { |
| 479 | { | 462 | pptr = (const char **)ptr; |
| 480 | pptr=(const char **)ptr; | 463 | if (num == 0) { |
| 481 | if (num == 0) | 464 | *pptr = data->param_hostname; |
| 482 | { | 465 | |
| 483 | *pptr=data->param_hostname; | 466 | } else if (num == 1) { |
| 484 | 467 | *pptr = data->param_port; | |
| 485 | } | 468 | } else if (num == 2) { |
| 486 | else if (num == 1) | 469 | *pptr = (char *)&(data->ip[0]); |
| 487 | { | 470 | } else if (num == 3) { |
| 488 | *pptr=data->param_port; | 471 | *((int *)ptr) = data->port; |
| 489 | } | ||
| 490 | else if (num == 2) | ||
| 491 | { | ||
| 492 | *pptr= (char *)&(data->ip[0]); | ||
| 493 | } | ||
| 494 | else if (num == 3) | ||
| 495 | { | ||
| 496 | *((int *)ptr)=data->port; | ||
| 497 | } | ||
| 498 | if ((!b->init) || (ptr == NULL)) | ||
| 499 | *pptr="not initialized"; | ||
| 500 | ret=1; | ||
| 501 | } | 472 | } |
| 473 | if ((!b->init) || (ptr == NULL)) | ||
| 474 | *pptr = "not initialized"; | ||
| 475 | ret = 1; | ||
| 476 | } | ||
| 502 | break; | 477 | break; |
| 503 | case BIO_C_SET_CONNECT: | 478 | case BIO_C_SET_CONNECT: |
| 504 | if (ptr != NULL) | 479 | if (ptr != NULL) { |
| 505 | { | 480 | b->init = 1; |
| 506 | b->init=1; | 481 | if (num == 0) { |
| 507 | if (num == 0) | ||
| 508 | { | ||
| 509 | if (data->param_hostname != NULL) | 482 | if (data->param_hostname != NULL) |
| 510 | OPENSSL_free(data->param_hostname); | 483 | OPENSSL_free(data->param_hostname); |
| 511 | data->param_hostname=BUF_strdup(ptr); | 484 | data->param_hostname = BUF_strdup(ptr); |
| 512 | } | 485 | } else if (num == 1) { |
| 513 | else if (num == 1) | ||
| 514 | { | ||
| 515 | if (data->param_port != NULL) | 486 | if (data->param_port != NULL) |
| 516 | OPENSSL_free(data->param_port); | 487 | OPENSSL_free(data->param_port); |
| 517 | data->param_port=BUF_strdup(ptr); | 488 | data->param_port = BUF_strdup(ptr); |
| 518 | } | 489 | } else if (num == 2) { |
| 519 | else if (num == 2) | ||
| 520 | { | ||
| 521 | char buf[16]; | 490 | char buf[16]; |
| 522 | unsigned char *p = ptr; | 491 | unsigned char *p = ptr; |
| 523 | 492 | ||
| 524 | (void) snprintf(buf,sizeof buf,"%d.%d.%d.%d", | 493 | (void) snprintf(buf, sizeof buf, "%d.%d.%d.%d", |
| 525 | p[0],p[1],p[2],p[3]); | 494 | p[0], p[1], p[2], p[3]); |
| 526 | if (data->param_hostname != NULL) | 495 | if (data->param_hostname != NULL) |
| 527 | OPENSSL_free(data->param_hostname); | 496 | OPENSSL_free(data->param_hostname); |
| 528 | data->param_hostname=BUF_strdup(buf); | 497 | data->param_hostname = BUF_strdup(buf); |
| 529 | memcpy(&(data->ip[0]),ptr,4); | 498 | memcpy(&(data->ip[0]), ptr, 4); |
| 530 | } | 499 | } else if (num == 3) { |
| 531 | else if (num == 3) | 500 | char buf[DECIMAL_SIZE(int) + 1]; |
| 532 | { | ||
| 533 | char buf[DECIMAL_SIZE(int)+1]; | ||
| 534 | 501 | ||
| 535 | (void) snprintf(buf,sizeof buf,"%d",*(int *)ptr); | 502 | (void) snprintf(buf, sizeof buf, "%d", |
| 503 | *(int *)ptr); | ||
| 536 | if (data->param_port != NULL) | 504 | if (data->param_port != NULL) |
| 537 | OPENSSL_free(data->param_port); | 505 | OPENSSL_free(data->param_port); |
| 538 | data->param_port=BUF_strdup(buf); | 506 | data->param_port = BUF_strdup(buf); |
| 539 | data->port= *(int *)ptr; | 507 | data->port= *(int *)ptr; |
| 540 | } | ||
| 541 | } | 508 | } |
| 509 | } | ||
| 542 | break; | 510 | break; |
| 543 | case BIO_C_SET_NBIO: | 511 | case BIO_C_SET_NBIO: |
| 544 | data->nbio=(int)num; | 512 | data->nbio = (int)num; |
| 545 | break; | 513 | break; |
| 546 | case BIO_C_GET_FD: | 514 | case BIO_C_GET_FD: |
| 547 | if (b->init) | 515 | if (b->init) { |
| 548 | { | 516 | ip = (int *)ptr; |
| 549 | ip=(int *)ptr; | ||
| 550 | if (ip != NULL) | 517 | if (ip != NULL) |
| 551 | *ip=b->num; | 518 | *ip = b->num; |
| 552 | ret=b->num; | 519 | ret = b->num; |
| 553 | } | 520 | } else |
| 554 | else | 521 | ret = -1; |
| 555 | ret= -1; | ||
| 556 | break; | 522 | break; |
| 557 | case BIO_CTRL_GET_CLOSE: | 523 | case BIO_CTRL_GET_CLOSE: |
| 558 | ret=b->shutdown; | 524 | ret = b->shutdown; |
| 559 | break; | 525 | break; |
| 560 | case BIO_CTRL_SET_CLOSE: | 526 | case BIO_CTRL_SET_CLOSE: |
| 561 | b->shutdown=(int)num; | 527 | b->shutdown = (int)num; |
| 562 | break; | 528 | break; |
| 563 | case BIO_CTRL_PENDING: | 529 | case BIO_CTRL_PENDING: |
| 564 | case BIO_CTRL_WPENDING: | 530 | case BIO_CTRL_WPENDING: |
| 565 | ret=0; | 531 | ret = 0; |
| 566 | break; | 532 | break; |
| 567 | case BIO_CTRL_FLUSH: | 533 | case BIO_CTRL_FLUSH: |
| 568 | break; | 534 | break; |
| 569 | case BIO_CTRL_DUP: | 535 | case BIO_CTRL_DUP: |
| 570 | { | 536 | { |
| 571 | dbio=(BIO *)ptr; | 537 | dbio = (BIO *)ptr; |
| 572 | if (data->param_port) | 538 | if (data->param_port) |
| 573 | BIO_set_conn_port(dbio,data->param_port); | 539 | BIO_set_conn_port(dbio, data->param_port); |
| 574 | if (data->param_hostname) | 540 | if (data->param_hostname) |
| 575 | BIO_set_conn_hostname(dbio,data->param_hostname); | 541 | BIO_set_conn_hostname(dbio, |
| 576 | BIO_set_nbio(dbio,data->nbio); | 542 | data->param_hostname); |
| 577 | /* FIXME: the cast of the function seems unlikely to be a good idea */ | 543 | BIO_set_nbio(dbio, data->nbio); |
| 578 | (void)BIO_set_info_callback(dbio,(bio_info_cb *)data->info_callback); | 544 | /* FIXME: the cast of the function seems unlikely to be a good idea */ |
| 545 | (void)BIO_set_info_callback(dbio, | ||
| 546 | (bio_info_cb *)data->info_callback); | ||
| 579 | } | 547 | } |
| 580 | break; | 548 | break; |
| 581 | case BIO_CTRL_SET_CALLBACK: | 549 | case BIO_CTRL_SET_CALLBACK: |
| 582 | { | 550 | { |
| 583 | #if 0 /* FIXME: Should this be used? -- Richard Levitte */ | 551 | #if 0 /* FIXME: Should this be used? -- Richard Levitte */ |
| 584 | BIOerr(BIO_F_CONN_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 552 | BIOerr(BIO_F_CONN_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
| 585 | ret = -1; | 553 | ret = -1; |
| 586 | #else | 554 | #else |
| 587 | ret=0; | 555 | ret = 0; |
| 588 | #endif | 556 | #endif |
| 589 | } | 557 | } |
| 590 | break; | 558 | break; |
| 591 | case BIO_CTRL_GET_CALLBACK: | 559 | case BIO_CTRL_GET_CALLBACK: |
| 592 | { | 560 | { |
| 593 | int (**fptr)(const BIO *bio,int state,int xret); | 561 | int (**fptr)(const BIO *bio, int state, int xret); |
| 594 | 562 | ||
| 595 | fptr=(int (**)(const BIO *bio,int state,int xret))ptr; | 563 | fptr = (int (**)(const BIO *bio, int state, int xret))ptr; |
| 596 | *fptr=data->info_callback; | 564 | *fptr = data->info_callback; |
| 597 | } | 565 | } |
| 598 | break; | 566 | break; |
| 599 | default: | 567 | default: |
| 600 | ret=0; | 568 | ret = 0; |
| 601 | break; | 569 | break; |
| 602 | } | ||
| 603 | return(ret); | ||
| 604 | } | 570 | } |
| 571 | return (ret); | ||
| 572 | } | ||
| 605 | 573 | ||
| 606 | static long conn_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) | 574 | static long |
| 607 | { | 575 | conn_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) |
| 608 | long ret=1; | 576 | { |
| 577 | long ret = 1; | ||
| 609 | BIO_CONNECT *data; | 578 | BIO_CONNECT *data; |
| 610 | 579 | ||
| 611 | data=(BIO_CONNECT *)b->ptr; | 580 | data = (BIO_CONNECT *)b->ptr; |
| 612 | 581 | ||
| 613 | switch (cmd) | 582 | switch (cmd) { |
| 614 | { | ||
| 615 | case BIO_CTRL_SET_CALLBACK: | 583 | case BIO_CTRL_SET_CALLBACK: |
| 616 | { | 584 | { |
| 617 | data->info_callback=(int (*)(const struct bio_st *, int, int))fp; | 585 | data->info_callback = (int (*)(const struct bio_st *, int, int))fp; |
| 618 | } | 586 | } |
| 619 | break; | 587 | break; |
| 620 | default: | 588 | default: |
| 621 | ret=0; | 589 | ret = 0; |
| 622 | break; | 590 | break; |
| 623 | } | ||
| 624 | return(ret); | ||
| 625 | } | 591 | } |
| 626 | 592 | return (ret); | |
| 627 | static int conn_puts(BIO *bp, const char *str) | 593 | } |
| 628 | { | 594 | |
| 629 | int n,ret; | 595 | static int |
| 630 | 596 | conn_puts(BIO *bp, const char *str) | |
| 631 | n=strlen(str); | 597 | { |
| 632 | ret=conn_write(bp,str,n); | 598 | int n, ret; |
| 633 | return(ret); | 599 | |
| 634 | } | 600 | n = strlen(str); |
| 635 | 601 | ret = conn_write(bp, str, n); | |
| 636 | BIO *BIO_new_connect(char *str) | 602 | return (ret); |
| 637 | { | 603 | } |
| 604 | |||
| 605 | BIO | ||
| 606 | *BIO_new_connect(char *str) | ||
| 607 | { | ||
| 638 | BIO *ret; | 608 | BIO *ret; |
| 639 | 609 | ||
| 640 | ret=BIO_new(BIO_s_connect()); | 610 | ret = BIO_new(BIO_s_connect()); |
| 641 | if (ret == NULL) return(NULL); | 611 | if (ret == NULL) |
| 642 | if (BIO_set_conn_hostname(ret,str)) | 612 | return (NULL); |
| 643 | return(ret); | 613 | if (BIO_set_conn_hostname(ret, str)) |
| 644 | else | 614 | return (ret); |
| 645 | { | 615 | else { |
| 646 | BIO_free(ret); | 616 | BIO_free(ret); |
| 647 | return(NULL); | 617 | return (NULL); |
| 648 | } | ||
| 649 | } | 618 | } |
| 619 | } | ||
| 650 | 620 | ||
| 651 | #endif | 621 | #endif |
| 652 | |||
diff --git a/src/lib/libssl/src/crypto/bio/bss_dgram.c b/src/lib/libssl/src/crypto/bio/bss_dgram.c index 67a13ae845..330f6fc404 100644 --- a/src/lib/libssl/src/crypto/bio/bss_dgram.c +++ b/src/lib/libssl/src/crypto/bio/bss_dgram.c | |||
| @@ -113,7 +113,8 @@ static long dgram_sctp_ctrl(BIO *h, int cmd, long arg1, void *arg2); | |||
| 113 | static int dgram_sctp_new(BIO *h); | 113 | static int dgram_sctp_new(BIO *h); |
| 114 | static int dgram_sctp_free(BIO *data); | 114 | static int dgram_sctp_free(BIO *data); |
| 115 | #ifdef SCTP_AUTHENTICATION_EVENT | 115 | #ifdef SCTP_AUTHENTICATION_EVENT |
| 116 | static void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp); | 116 | static void dgram_sctp_handle_auth_free_key_event(BIO *b, |
| 117 | union sctp_notification *snp); | ||
| 117 | #endif | 118 | #endif |
| 118 | #endif | 119 | #endif |
| 119 | 120 | ||
| @@ -121,8 +122,7 @@ static int BIO_dgram_should_retry(int s); | |||
| 121 | 122 | ||
| 122 | static void get_current_time(struct timeval *t); | 123 | static void get_current_time(struct timeval *t); |
| 123 | 124 | ||
| 124 | static BIO_METHOD methods_dgramp= | 125 | static BIO_METHOD methods_dgramp = { |
| 125 | { | ||
| 126 | BIO_TYPE_DGRAM, | 126 | BIO_TYPE_DGRAM, |
| 127 | "datagram socket", | 127 | "datagram socket", |
| 128 | dgram_write, | 128 | dgram_write, |
| @@ -133,11 +133,10 @@ static BIO_METHOD methods_dgramp= | |||
| 133 | dgram_new, | 133 | dgram_new, |
| 134 | dgram_free, | 134 | dgram_free, |
| 135 | NULL, | 135 | NULL, |
| 136 | }; | 136 | }; |
| 137 | 137 | ||
| 138 | #ifndef OPENSSL_NO_SCTP | 138 | #ifndef OPENSSL_NO_SCTP |
| 139 | static BIO_METHOD methods_dgramp_sctp= | 139 | static BIO_METHOD methods_dgramp_sctp = { |
| 140 | { | ||
| 141 | BIO_TYPE_DGRAM_SCTP, | 140 | BIO_TYPE_DGRAM_SCTP, |
| 142 | "datagram sctp socket", | 141 | "datagram sctp socket", |
| 143 | dgram_sctp_write, | 142 | dgram_sctp_write, |
| @@ -148,11 +147,10 @@ static BIO_METHOD methods_dgramp_sctp= | |||
| 148 | dgram_sctp_new, | 147 | dgram_sctp_new, |
| 149 | dgram_sctp_free, | 148 | dgram_sctp_free, |
| 150 | NULL, | 149 | NULL, |
| 151 | }; | 150 | }; |
| 152 | #endif | 151 | #endif |
| 153 | 152 | ||
| 154 | typedef struct bio_dgram_data_st | 153 | typedef struct bio_dgram_data_st { |
| 155 | { | ||
| 156 | union { | 154 | union { |
| 157 | struct sockaddr sa; | 155 | struct sockaddr sa; |
| 158 | struct sockaddr_in sa_in; | 156 | struct sockaddr_in sa_in; |
| @@ -165,18 +163,16 @@ typedef struct bio_dgram_data_st | |||
| 165 | unsigned int mtu; | 163 | unsigned int mtu; |
| 166 | struct timeval next_timeout; | 164 | struct timeval next_timeout; |
| 167 | struct timeval socket_timeout; | 165 | struct timeval socket_timeout; |
| 168 | } bio_dgram_data; | 166 | } bio_dgram_data; |
| 169 | 167 | ||
| 170 | #ifndef OPENSSL_NO_SCTP | 168 | #ifndef OPENSSL_NO_SCTP |
| 171 | typedef struct bio_dgram_sctp_save_message_st | 169 | typedef struct bio_dgram_sctp_save_message_st { |
| 172 | { | 170 | BIO *bio; |
| 173 | BIO *bio; | 171 | char *data; |
| 174 | char *data; | 172 | int length; |
| 175 | int length; | 173 | } bio_dgram_sctp_save_message; |
| 176 | } bio_dgram_sctp_save_message; | ||
| 177 | 174 | ||
| 178 | typedef struct bio_dgram_sctp_data_st | 175 | typedef struct bio_dgram_sctp_data_st { |
| 179 | { | ||
| 180 | union { | 176 | union { |
| 181 | struct sockaddr sa; | 177 | struct sockaddr sa; |
| 182 | struct sockaddr_in sa_in; | 178 | struct sockaddr_in sa_in; |
| @@ -198,79 +194,88 @@ typedef struct bio_dgram_sctp_data_st | |||
| 198 | int save_shutdown; | 194 | int save_shutdown; |
| 199 | int peer_auth_tested; | 195 | int peer_auth_tested; |
| 200 | bio_dgram_sctp_save_message saved_message; | 196 | bio_dgram_sctp_save_message saved_message; |
| 201 | } bio_dgram_sctp_data; | 197 | } bio_dgram_sctp_data; |
| 202 | #endif | 198 | #endif |
| 203 | 199 | ||
| 204 | BIO_METHOD *BIO_s_datagram(void) | 200 | BIO_METHOD |
| 205 | { | 201 | *BIO_s_datagram(void) |
| 206 | return(&methods_dgramp); | 202 | { |
| 207 | } | 203 | return (&methods_dgramp); |
| 204 | } | ||
| 208 | 205 | ||
| 209 | BIO *BIO_new_dgram(int fd, int close_flag) | 206 | BIO |
| 210 | { | 207 | *BIO_new_dgram(int fd, int close_flag) |
| 208 | { | ||
| 211 | BIO *ret; | 209 | BIO *ret; |
| 212 | 210 | ||
| 213 | ret=BIO_new(BIO_s_datagram()); | 211 | ret = BIO_new(BIO_s_datagram()); |
| 214 | if (ret == NULL) return(NULL); | 212 | if (ret == NULL) |
| 215 | BIO_set_fd(ret,fd,close_flag); | 213 | return (NULL); |
| 216 | return(ret); | 214 | BIO_set_fd(ret, fd, close_flag); |
| 217 | } | 215 | return (ret); |
| 216 | } | ||
| 218 | 217 | ||
| 219 | static int dgram_new(BIO *bi) | 218 | static int |
| 220 | { | 219 | dgram_new(BIO *bi) |
| 220 | { | ||
| 221 | bio_dgram_data *data = NULL; | 221 | bio_dgram_data *data = NULL; |
| 222 | 222 | ||
| 223 | bi->init=0; | 223 | bi->init = 0; |
| 224 | bi->num=0; | 224 | bi->num = 0; |
| 225 | data = OPENSSL_malloc(sizeof(bio_dgram_data)); | 225 | data = OPENSSL_malloc(sizeof(bio_dgram_data)); |
| 226 | if (data == NULL) | 226 | if (data == NULL) |
| 227 | return 0; | 227 | return 0; |
| 228 | memset(data, 0x00, sizeof(bio_dgram_data)); | 228 | memset(data, 0x00, sizeof(bio_dgram_data)); |
| 229 | bi->ptr = data; | 229 | bi->ptr = data; |
| 230 | 230 | ||
| 231 | bi->flags=0; | 231 | bi->flags = 0; |
| 232 | return(1); | 232 | return (1); |
| 233 | } | 233 | } |
| 234 | 234 | ||
| 235 | static int dgram_free(BIO *a) | 235 | static int |
| 236 | { | 236 | dgram_free(BIO *a) |
| 237 | { | ||
| 237 | bio_dgram_data *data; | 238 | bio_dgram_data *data; |
| 238 | 239 | ||
| 239 | if (a == NULL) return(0); | 240 | if (a == NULL) |
| 240 | if ( ! dgram_clear(a)) | 241 | return (0); |
| 242 | if (!dgram_clear(a)) | ||
| 241 | return 0; | 243 | return 0; |
| 242 | 244 | ||
| 243 | data = (bio_dgram_data *)a->ptr; | 245 | data = (bio_dgram_data *)a->ptr; |
| 244 | if(data != NULL) OPENSSL_free(data); | 246 | if (data != NULL) |
| 247 | OPENSSL_free(data); | ||
| 245 | 248 | ||
| 246 | return(1); | 249 | return (1); |
| 247 | } | 250 | } |
| 248 | 251 | ||
| 249 | static int dgram_clear(BIO *a) | 252 | static int |
| 250 | { | 253 | dgram_clear(BIO *a) |
| 251 | if (a == NULL) return(0); | 254 | { |
| 252 | if (a->shutdown) | 255 | if (a == NULL) |
| 253 | { | 256 | return (0); |
| 254 | if (a->init) | 257 | if (a->shutdown) { |
| 255 | { | 258 | if (a->init) { |
| 256 | shutdown(a->num, SHUT_RDWR); | 259 | shutdown(a->num, SHUT_RDWR); |
| 257 | close(a->num); | 260 | close(a->num); |
| 258 | } | ||
| 259 | a->init=0; | ||
| 260 | a->flags=0; | ||
| 261 | } | 261 | } |
| 262 | return(1); | 262 | a->init = 0; |
| 263 | a->flags = 0; | ||
| 263 | } | 264 | } |
| 265 | return (1); | ||
| 266 | } | ||
| 264 | 267 | ||
| 265 | static void dgram_adjust_rcv_timeout(BIO *b) | 268 | static void |
| 266 | { | 269 | dgram_adjust_rcv_timeout(BIO *b) |
| 270 | { | ||
| 267 | #if defined(SO_RCVTIMEO) | 271 | #if defined(SO_RCVTIMEO) |
| 268 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; | 272 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; |
| 269 | union { size_t s; int i; } sz = {0}; | 273 | union { size_t s; |
| 274 | int i; | ||
| 275 | } sz = {0}; | ||
| 270 | 276 | ||
| 271 | /* Is a timer active? */ | 277 | /* Is a timer active? */ |
| 272 | if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) | 278 | if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) { |
| 273 | { | ||
| 274 | struct timeval timenow, timeleft; | 279 | struct timeval timenow, timeleft; |
| 275 | 280 | ||
| 276 | /* Read current socket timeout */ | 281 | /* Read current socket timeout */ |
| @@ -279,20 +284,19 @@ static void dgram_adjust_rcv_timeout(BIO *b) | |||
| 279 | 284 | ||
| 280 | sz.i = sizeof(timeout); | 285 | sz.i = sizeof(timeout); |
| 281 | if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 286 | if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 282 | (void*)&timeout, &sz.i) < 0) | 287 | (void*)&timeout, &sz.i) < 0) { |
| 283 | { perror("getsockopt"); } | 288 | perror("getsockopt"); |
| 284 | else | 289 | } else { |
| 285 | { | ||
| 286 | data->socket_timeout.tv_sec = timeout / 1000; | 290 | data->socket_timeout.tv_sec = timeout / 1000; |
| 287 | data->socket_timeout.tv_usec = (timeout % 1000) * 1000; | 291 | data->socket_timeout.tv_usec = (timeout % 1000) * 1000; |
| 288 | } | 292 | } |
| 289 | #else | 293 | #else |
| 290 | sz.i = sizeof(data->socket_timeout); | 294 | sz.i = sizeof(data->socket_timeout); |
| 291 | if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 295 | if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 292 | &(data->socket_timeout), (void *)&sz) < 0) | 296 | &(data->socket_timeout), (void *)&sz) < 0) { |
| 293 | { perror("getsockopt"); } | 297 | perror("getsockopt"); |
| 294 | else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) | 298 | } else if (sizeof(sz.s) != sizeof(sz.i) && sz.i == 0) |
| 295 | OPENSSL_assert(sz.s<=sizeof(data->socket_timeout)); | 299 | OPENSSL_assert(sz.s <= sizeof(data->socket_timeout)); |
| 296 | #endif | 300 | #endif |
| 297 | 301 | ||
| 298 | /* Get current time */ | 302 | /* Get current time */ |
| @@ -302,126 +306,128 @@ static void dgram_adjust_rcv_timeout(BIO *b) | |||
| 302 | memcpy(&timeleft, &(data->next_timeout), sizeof(struct timeval)); | 306 | memcpy(&timeleft, &(data->next_timeout), sizeof(struct timeval)); |
| 303 | timeleft.tv_sec -= timenow.tv_sec; | 307 | timeleft.tv_sec -= timenow.tv_sec; |
| 304 | timeleft.tv_usec -= timenow.tv_usec; | 308 | timeleft.tv_usec -= timenow.tv_usec; |
| 305 | if (timeleft.tv_usec < 0) | 309 | if (timeleft.tv_usec < 0) { |
| 306 | { | ||
| 307 | timeleft.tv_sec--; | 310 | timeleft.tv_sec--; |
| 308 | timeleft.tv_usec += 1000000; | 311 | timeleft.tv_usec += 1000000; |
| 309 | } | 312 | } |
| 310 | 313 | ||
| 311 | if (timeleft.tv_sec < 0) | 314 | if (timeleft.tv_sec < 0) { |
| 312 | { | ||
| 313 | timeleft.tv_sec = 0; | 315 | timeleft.tv_sec = 0; |
| 314 | timeleft.tv_usec = 1; | 316 | timeleft.tv_usec = 1; |
| 315 | } | 317 | } |
| 316 | 318 | ||
| 317 | /* Adjust socket timeout if next handhake message timer | 319 | /* Adjust socket timeout if next handhake message timer |
| 318 | * will expire earlier. | 320 | * will expire earlier. |
| 319 | */ | 321 | */ |
| 320 | if ((data->socket_timeout.tv_sec == 0 && data->socket_timeout.tv_usec == 0) || | 322 | if ((data->socket_timeout.tv_sec == 0 && |
| 321 | (data->socket_timeout.tv_sec > timeleft.tv_sec) || | 323 | data->socket_timeout.tv_usec == 0) || |
| 322 | (data->socket_timeout.tv_sec == timeleft.tv_sec && | 324 | (data->socket_timeout.tv_sec > timeleft.tv_sec) || |
| 323 | data->socket_timeout.tv_usec >= timeleft.tv_usec)) | 325 | (data->socket_timeout.tv_sec == timeleft.tv_sec && |
| 324 | { | 326 | data->socket_timeout.tv_usec >= timeleft.tv_usec)) { |
| 325 | #ifdef OPENSSL_SYS_WINDOWS | 327 | #ifdef OPENSSL_SYS_WINDOWS |
| 326 | timeout = timeleft.tv_sec * 1000 + timeleft.tv_usec / 1000; | 328 | timeout = timeleft.tv_sec * 1000 + timeleft.tv_usec / 1000; |
| 327 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 329 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 328 | (void*)&timeout, sizeof(timeout)) < 0) | 330 | (void*)&timeout, sizeof(timeout)) < 0) { |
| 329 | { perror("setsockopt"); } | 331 | perror("setsockopt"); |
| 332 | } | ||
| 330 | #else | 333 | #else |
| 331 | if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &timeleft, | 334 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 332 | sizeof(struct timeval)) < 0) | 335 | &timeleft, sizeof(struct timeval)) < 0) { |
| 333 | { perror("setsockopt"); } | 336 | perror("setsockopt"); |
| 334 | #endif | ||
| 335 | } | 337 | } |
| 336 | } | ||
| 337 | #endif | 338 | #endif |
| 339 | } | ||
| 338 | } | 340 | } |
| 341 | #endif | ||
| 342 | } | ||
| 339 | 343 | ||
| 340 | static void dgram_reset_rcv_timeout(BIO *b) | 344 | static void |
| 341 | { | 345 | dgram_reset_rcv_timeout(BIO *b) |
| 346 | { | ||
| 342 | #if defined(SO_RCVTIMEO) | 347 | #if defined(SO_RCVTIMEO) |
| 343 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; | 348 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; |
| 344 | 349 | ||
| 345 | /* Is a timer active? */ | 350 | /* Is a timer active? */ |
| 346 | if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) | 351 | if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) { |
| 347 | { | ||
| 348 | #ifdef OPENSSL_SYS_WINDOWS | 352 | #ifdef OPENSSL_SYS_WINDOWS |
| 349 | int timeout = data->socket_timeout.tv_sec * 1000 + | 353 | int timeout = data->socket_timeout.tv_sec * 1000 + |
| 350 | data->socket_timeout.tv_usec / 1000; | 354 | data->socket_timeout.tv_usec / 1000; |
| 351 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 355 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 352 | (void*)&timeout, sizeof(timeout)) < 0) | 356 | (void*)&timeout, sizeof(timeout)) < 0) { |
| 353 | { perror("setsockopt"); } | 357 | perror("setsockopt"); |
| 358 | } | ||
| 354 | #else | 359 | #else |
| 355 | if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &(data->socket_timeout), | 360 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 356 | sizeof(struct timeval)) < 0) | 361 | &(data->socket_timeout), sizeof(struct timeval)) < 0) { |
| 357 | { perror("setsockopt"); } | 362 | perror("setsockopt"); |
| 358 | #endif | ||
| 359 | } | 363 | } |
| 360 | #endif | 364 | #endif |
| 361 | } | 365 | } |
| 366 | #endif | ||
| 367 | } | ||
| 362 | 368 | ||
| 363 | static int dgram_read(BIO *b, char *out, int outl) | 369 | static int |
| 364 | { | 370 | dgram_read(BIO *b, char *out, int outl) |
| 365 | int ret=0; | 371 | { |
| 372 | int ret = 0; | ||
| 366 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; | 373 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; |
| 367 | 374 | ||
| 368 | struct { | 375 | struct { |
| 369 | /* | 376 | /* |
| 370 | * See commentary in b_sock.c. <appro> | 377 | * See commentary in b_sock.c. <appro> |
| 371 | */ | 378 | */ |
| 372 | union { size_t s; int i; } len; | 379 | union { |
| 373 | union { | 380 | size_t s; |
| 374 | struct sockaddr sa; | 381 | int i; |
| 375 | struct sockaddr_in sa_in; | 382 | } len; |
| 383 | union { | ||
| 384 | struct sockaddr sa; | ||
| 385 | struct sockaddr_in sa_in; | ||
| 376 | #if OPENSSL_USE_IPV6 | 386 | #if OPENSSL_USE_IPV6 |
| 377 | struct sockaddr_in6 sa_in6; | 387 | struct sockaddr_in6 sa_in6; |
| 378 | #endif | 388 | #endif |
| 379 | } peer; | 389 | } peer; |
| 380 | } sa; | 390 | } sa; |
| 381 | 391 | ||
| 382 | sa.len.s=0; | 392 | sa.len.s = 0; |
| 383 | sa.len.i=sizeof(sa.peer); | 393 | sa.len.i = sizeof(sa.peer); |
| 384 | 394 | ||
| 385 | if (out != NULL) | 395 | if (out != NULL) { |
| 386 | { | ||
| 387 | errno = 0; | 396 | errno = 0; |
| 388 | memset(&sa.peer, 0x00, sizeof(sa.peer)); | 397 | memset(&sa.peer, 0x00, sizeof(sa.peer)); |
| 389 | dgram_adjust_rcv_timeout(b); | 398 | dgram_adjust_rcv_timeout(b); |
| 390 | ret=recvfrom(b->num,out,outl,0,&sa.peer.sa,(void *)&sa.len); | 399 | ret = recvfrom(b->num, out, outl, 0, &sa.peer.sa,(void *)&sa.len); |
| 391 | if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0) | 400 | if (sizeof(sa.len.i) != sizeof(sa.len.s) && sa.len.i == 0) { |
| 392 | { | 401 | OPENSSL_assert(sa.len.s <= sizeof(sa.peer)); |
| 393 | OPENSSL_assert(sa.len.s<=sizeof(sa.peer)); | ||
| 394 | sa.len.i = (int)sa.len.s; | 402 | sa.len.i = (int)sa.len.s; |
| 395 | } | 403 | } |
| 396 | 404 | ||
| 397 | if ( ! data->connected && ret >= 0) | 405 | if (! data->connected && ret >= 0) |
| 398 | BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &sa.peer); | 406 | BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &sa.peer); |
| 399 | 407 | ||
| 400 | BIO_clear_retry_flags(b); | 408 | BIO_clear_retry_flags(b); |
| 401 | if (ret < 0) | 409 | if (ret < 0) { |
| 402 | { | 410 | if (BIO_dgram_should_retry(ret)) { |
| 403 | if (BIO_dgram_should_retry(ret)) | ||
| 404 | { | ||
| 405 | BIO_set_retry_read(b); | 411 | BIO_set_retry_read(b); |
| 406 | data->_errno = errno; | 412 | data->_errno = errno; |
| 407 | } | ||
| 408 | } | 413 | } |
| 414 | } | ||
| 409 | 415 | ||
| 410 | dgram_reset_rcv_timeout(b); | 416 | dgram_reset_rcv_timeout(b); |
| 411 | } | ||
| 412 | return(ret); | ||
| 413 | } | 417 | } |
| 418 | return (ret); | ||
| 419 | } | ||
| 414 | 420 | ||
| 415 | static int dgram_write(BIO *b, const char *in, int inl) | 421 | static int |
| 416 | { | 422 | dgram_write(BIO *b, const char *in, int inl) |
| 423 | { | ||
| 417 | int ret; | 424 | int ret; |
| 418 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; | 425 | bio_dgram_data *data = (bio_dgram_data *)b->ptr; |
| 419 | errno = 0; | 426 | errno = 0; |
| 420 | 427 | ||
| 421 | if ( data->connected ) | 428 | if (data->connected) |
| 422 | ret=write(b->num,in,inl); | 429 | ret = write(b->num, in, inl); |
| 423 | else | 430 | else { |
| 424 | { | ||
| 425 | int peerlen = sizeof(data->peer); | 431 | int peerlen = sizeof(data->peer); |
| 426 | 432 | ||
| 427 | if (data->peer.sa.sa_family == AF_INET) | 433 | if (data->peer.sa.sa_family == AF_INET) |
| @@ -431,33 +437,33 @@ static int dgram_write(BIO *b, const char *in, int inl) | |||
| 431 | peerlen = sizeof(data->peer.sa_in6); | 437 | peerlen = sizeof(data->peer.sa_in6); |
| 432 | #endif | 438 | #endif |
| 433 | #if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK) | 439 | #if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK) |
| 434 | ret=sendto(b->num, (char *)in, inl, 0, &data->peer.sa, peerlen); | 440 | ret = sendto(b->num, (char *)in, inl, 0, &data->peer.sa, peerlen); |
| 435 | #else | 441 | #else |
| 436 | ret=sendto(b->num, in, inl, 0, &data->peer.sa, peerlen); | 442 | ret = sendto(b->num, in, inl, 0, &data->peer.sa, peerlen); |
| 437 | #endif | 443 | #endif |
| 438 | } | 444 | } |
| 439 | 445 | ||
| 440 | BIO_clear_retry_flags(b); | 446 | BIO_clear_retry_flags(b); |
| 441 | if (ret <= 0) | 447 | if (ret <= 0) { |
| 442 | { | 448 | if (BIO_dgram_should_retry(ret)) { |
| 443 | if (BIO_dgram_should_retry(ret)) | 449 | BIO_set_retry_write(b); |
| 444 | { | 450 | |
| 445 | BIO_set_retry_write(b); | ||
| 446 | data->_errno = errno; | 451 | data->_errno = errno; |
| 447 | 452 | ||
| 448 | #if 0 /* higher layers are responsible for querying MTU, if necessary */ | 453 | #if 0 /* higher layers are responsible for querying MTU, if necessary */ |
| 449 | if ( data->_errno == EMSGSIZE) | 454 | if (data->_errno == EMSGSIZE) |
| 450 | /* retrieve the new MTU */ | 455 | /* retrieve the new MTU */ |
| 451 | BIO_ctrl(b, BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL); | 456 | BIO_ctrl(b, BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL); |
| 452 | #endif | 457 | #endif |
| 453 | } | ||
| 454 | } | 458 | } |
| 455 | return(ret); | ||
| 456 | } | 459 | } |
| 460 | return (ret); | ||
| 461 | } | ||
| 457 | 462 | ||
| 458 | static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | 463 | static long |
| 459 | { | 464 | dgram_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 460 | long ret=1; | 465 | { |
| 466 | long ret = 1; | ||
| 461 | int *ip; | 467 | int *ip; |
| 462 | struct sockaddr *to = NULL; | 468 | struct sockaddr *to = NULL; |
| 463 | bio_dgram_data *data = NULL; | 469 | bio_dgram_data *data = NULL; |
| @@ -472,76 +478,73 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 472 | #if OPENSSL_USE_IPV6 | 478 | #if OPENSSL_USE_IPV6 |
| 473 | struct sockaddr_in6 s6; | 479 | struct sockaddr_in6 s6; |
| 474 | #endif | 480 | #endif |
| 475 | } addr; | 481 | } addr; |
| 476 | #endif | 482 | #endif |
| 477 | 483 | ||
| 478 | data = (bio_dgram_data *)b->ptr; | 484 | data = (bio_dgram_data *)b->ptr; |
| 479 | 485 | ||
| 480 | switch (cmd) | 486 | switch (cmd) { |
| 481 | { | ||
| 482 | case BIO_CTRL_RESET: | 487 | case BIO_CTRL_RESET: |
| 483 | num=0; | 488 | num = 0; |
| 484 | case BIO_C_FILE_SEEK: | 489 | case BIO_C_FILE_SEEK: |
| 485 | ret=0; | 490 | ret = 0; |
| 486 | break; | 491 | break; |
| 487 | case BIO_C_FILE_TELL: | 492 | case BIO_C_FILE_TELL: |
| 488 | case BIO_CTRL_INFO: | 493 | case BIO_CTRL_INFO: |
| 489 | ret=0; | 494 | ret = 0; |
| 490 | break; | 495 | break; |
| 491 | case BIO_C_SET_FD: | 496 | case BIO_C_SET_FD: |
| 492 | dgram_clear(b); | 497 | dgram_clear(b); |
| 493 | b->num= *((int *)ptr); | 498 | b->num= *((int *)ptr); |
| 494 | b->shutdown=(int)num; | 499 | b->shutdown = (int)num; |
| 495 | b->init=1; | 500 | b->init = 1; |
| 496 | break; | 501 | break; |
| 497 | case BIO_C_GET_FD: | 502 | case BIO_C_GET_FD: |
| 498 | if (b->init) | 503 | if (b->init) { |
| 499 | { | 504 | ip = (int *)ptr; |
| 500 | ip=(int *)ptr; | 505 | if (ip != NULL) |
| 501 | if (ip != NULL) *ip=b->num; | 506 | *ip = b->num; |
| 502 | ret=b->num; | 507 | ret = b->num; |
| 503 | } | 508 | } else |
| 504 | else | 509 | ret = -1; |
| 505 | ret= -1; | ||
| 506 | break; | 510 | break; |
| 507 | case BIO_CTRL_GET_CLOSE: | 511 | case BIO_CTRL_GET_CLOSE: |
| 508 | ret=b->shutdown; | 512 | ret = b->shutdown; |
| 509 | break; | 513 | break; |
| 510 | case BIO_CTRL_SET_CLOSE: | 514 | case BIO_CTRL_SET_CLOSE: |
| 511 | b->shutdown=(int)num; | 515 | b->shutdown = (int)num; |
| 512 | break; | 516 | break; |
| 513 | case BIO_CTRL_PENDING: | 517 | case BIO_CTRL_PENDING: |
| 514 | case BIO_CTRL_WPENDING: | 518 | case BIO_CTRL_WPENDING: |
| 515 | ret=0; | 519 | ret = 0; |
| 516 | break; | 520 | break; |
| 517 | case BIO_CTRL_DUP: | 521 | case BIO_CTRL_DUP: |
| 518 | case BIO_CTRL_FLUSH: | 522 | case BIO_CTRL_FLUSH: |
| 519 | ret=1; | 523 | ret = 1; |
| 520 | break; | 524 | break; |
| 521 | case BIO_CTRL_DGRAM_CONNECT: | 525 | case BIO_CTRL_DGRAM_CONNECT: |
| 522 | to = (struct sockaddr *)ptr; | 526 | to = (struct sockaddr *)ptr; |
| 523 | #if 0 | 527 | #if 0 |
| 524 | if (connect(b->num, to, sizeof(struct sockaddr)) < 0) | 528 | if (connect(b->num, to, sizeof(struct sockaddr)) < 0) { |
| 525 | { perror("connect"); ret = 0; } | 529 | perror("connect"); |
| 526 | else | 530 | ret = 0; |
| 527 | { | 531 | } else { |
| 528 | #endif | 532 | #endif |
| 529 | switch (to->sa_family) | 533 | switch (to->sa_family) { |
| 530 | { | 534 | case AF_INET: |
| 531 | case AF_INET: | 535 | memcpy(&data->peer, to, sizeof(data->peer.sa_in)); |
| 532 | memcpy(&data->peer,to,sizeof(data->peer.sa_in)); | 536 | break; |
| 533 | break; | ||
| 534 | #if OPENSSL_USE_IPV6 | 537 | #if OPENSSL_USE_IPV6 |
| 535 | case AF_INET6: | 538 | case AF_INET6: |
| 536 | memcpy(&data->peer,to,sizeof(data->peer.sa_in6)); | 539 | memcpy(&data->peer, to, sizeof(data->peer.sa_in6)); |
| 537 | break; | 540 | break; |
| 538 | #endif | 541 | #endif |
| 539 | default: | 542 | default: |
| 540 | memcpy(&data->peer,to,sizeof(data->peer.sa)); | 543 | memcpy(&data->peer, to, sizeof(data->peer.sa)); |
| 541 | break; | 544 | break; |
| 542 | } | ||
| 543 | #if 0 | ||
| 544 | } | 545 | } |
| 546 | #if 0 | ||
| 547 | } | ||
| 545 | #endif | 548 | #endif |
| 546 | break; | 549 | break; |
| 547 | /* (Linux)kernel sets DF bit on outgoing IP packets */ | 550 | /* (Linux)kernel sets DF bit on outgoing IP packets */ |
| @@ -549,31 +552,31 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 549 | #if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO) | 552 | #if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO) |
| 550 | addr_len = (socklen_t)sizeof(addr); | 553 | addr_len = (socklen_t)sizeof(addr); |
| 551 | memset((void *)&addr, 0, sizeof(addr)); | 554 | memset((void *)&addr, 0, sizeof(addr)); |
| 552 | if (getsockname(b->num, &addr.sa, &addr_len) < 0) | 555 | if (getsockname(b->num, &addr.sa, &addr_len) < 0) { |
| 553 | { | ||
| 554 | ret = 0; | 556 | ret = 0; |
| 555 | break; | 557 | break; |
| 556 | } | 558 | } |
| 557 | switch (addr.sa.sa_family) | 559 | switch (addr.sa.sa_family) { |
| 558 | { | ||
| 559 | case AF_INET: | 560 | case AF_INET: |
| 560 | sockopt_val = IP_PMTUDISC_DO; | 561 | sockopt_val = IP_PMTUDISC_DO; |
| 561 | if ((ret = setsockopt(b->num, IPPROTO_IP, IP_MTU_DISCOVER, | 562 | if ((ret = setsockopt(b->num, IPPROTO_IP, |
| 562 | &sockopt_val, sizeof(sockopt_val))) < 0) | 563 | IP_MTU_DISCOVER, &sockopt_val, |
| 564 | sizeof(sockopt_val))) < 0) | ||
| 563 | perror("setsockopt"); | 565 | perror("setsockopt"); |
| 564 | break; | 566 | break; |
| 565 | #if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO) | 567 | #if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO) |
| 566 | case AF_INET6: | 568 | case AF_INET6: |
| 567 | sockopt_val = IPV6_PMTUDISC_DO; | 569 | sockopt_val = IPV6_PMTUDISC_DO; |
| 568 | if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER, | 570 | if ((ret = setsockopt(b->num, IPPROTO_IPV6, |
| 569 | &sockopt_val, sizeof(sockopt_val))) < 0) | 571 | IPV6_MTU_DISCOVER, &sockopt_val, |
| 572 | sizeof(sockopt_val))) < 0) | ||
| 570 | perror("setsockopt"); | 573 | perror("setsockopt"); |
| 571 | break; | 574 | break; |
| 572 | #endif | 575 | #endif |
| 573 | default: | 576 | default: |
| 574 | ret = -1; | 577 | ret = -1; |
| 575 | break; | 578 | break; |
| 576 | } | 579 | } |
| 577 | ret = -1; | 580 | ret = -1; |
| 578 | #else | 581 | #else |
| 579 | break; | 582 | break; |
| @@ -582,74 +585,67 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 582 | #if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU) | 585 | #if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU) |
| 583 | addr_len = (socklen_t)sizeof(addr); | 586 | addr_len = (socklen_t)sizeof(addr); |
| 584 | memset((void *)&addr, 0, sizeof(addr)); | 587 | memset((void *)&addr, 0, sizeof(addr)); |
| 585 | if (getsockname(b->num, &addr.sa, &addr_len) < 0) | 588 | if (getsockname(b->num, &addr.sa, &addr_len) < 0) { |
| 586 | { | ||
| 587 | ret = 0; | 589 | ret = 0; |
| 588 | break; | 590 | break; |
| 589 | } | 591 | } |
| 590 | sockopt_len = sizeof(sockopt_val); | 592 | sockopt_len = sizeof(sockopt_val); |
| 591 | switch (addr.sa.sa_family) | 593 | switch (addr.sa.sa_family) { |
| 592 | { | ||
| 593 | case AF_INET: | 594 | case AF_INET: |
| 594 | if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, (void *)&sockopt_val, | 595 | if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, |
| 595 | &sockopt_len)) < 0 || sockopt_val < 0) | 596 | (void *)&sockopt_val, &sockopt_len)) < 0 || |
| 596 | { | 597 | sockopt_val < 0) { |
| 597 | ret = 0; | 598 | ret = 0; |
| 598 | } | 599 | } else { |
| 599 | else | ||
| 600 | { | ||
| 601 | /* we assume that the transport protocol is UDP and no | 600 | /* we assume that the transport protocol is UDP and no |
| 602 | * IP options are used. | 601 | * IP options are used. |
| 603 | */ | 602 | */ |
| 604 | data->mtu = sockopt_val - 8 - 20; | 603 | data->mtu = sockopt_val - 8 - 20; |
| 605 | ret = data->mtu; | 604 | ret = data->mtu; |
| 606 | } | 605 | } |
| 607 | break; | 606 | break; |
| 608 | #if OPENSSL_USE_IPV6 && defined(IPV6_MTU) | 607 | #if OPENSSL_USE_IPV6 && defined(IPV6_MTU) |
| 609 | case AF_INET6: | 608 | case AF_INET6: |
| 610 | if ((ret = getsockopt(b->num, IPPROTO_IPV6, IPV6_MTU, (void *)&sockopt_val, | 609 | if ((ret = getsockopt(b->num, IPPROTO_IPV6, IPV6_MTU, |
| 611 | &sockopt_len)) < 0 || sockopt_val < 0) | 610 | (void *)&sockopt_val, &sockopt_len)) < 0 || |
| 612 | { | 611 | sockopt_val < 0) { |
| 613 | ret = 0; | 612 | ret = 0; |
| 614 | } | 613 | } else { |
| 615 | else | ||
| 616 | { | ||
| 617 | /* we assume that the transport protocol is UDP and no | 614 | /* we assume that the transport protocol is UDP and no |
| 618 | * IPV6 options are used. | 615 | * IPV6 options are used. |
| 619 | */ | 616 | */ |
| 620 | data->mtu = sockopt_val - 8 - 40; | 617 | data->mtu = sockopt_val - 8 - 40; |
| 621 | ret = data->mtu; | 618 | ret = data->mtu; |
| 622 | } | 619 | } |
| 623 | break; | 620 | break; |
| 624 | #endif | 621 | #endif |
| 625 | default: | 622 | default: |
| 626 | ret = 0; | 623 | ret = 0; |
| 627 | break; | 624 | break; |
| 628 | } | 625 | } |
| 629 | #else | 626 | #else |
| 630 | ret = 0; | 627 | ret = 0; |
| 631 | #endif | 628 | #endif |
| 632 | break; | 629 | break; |
| 633 | case BIO_CTRL_DGRAM_GET_FALLBACK_MTU: | 630 | case BIO_CTRL_DGRAM_GET_FALLBACK_MTU: |
| 634 | switch (data->peer.sa.sa_family) | 631 | switch (data->peer.sa.sa_family) { |
| 635 | { | 632 | case AF_INET: |
| 636 | case AF_INET: | 633 | ret = 576 - 20 - 8; |
| 637 | ret = 576 - 20 - 8; | 634 | break; |
| 638 | break; | ||
| 639 | #if OPENSSL_USE_IPV6 | 635 | #if OPENSSL_USE_IPV6 |
| 640 | case AF_INET6: | 636 | case AF_INET6: |
| 641 | #ifdef IN6_IS_ADDR_V4MAPPED | 637 | #ifdef IN6_IS_ADDR_V4MAPPED |
| 642 | if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6_addr)) | 638 | if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6_addr)) |
| 643 | ret = 576 - 20 - 8; | 639 | ret = 576 - 20 - 8; |
| 644 | else | 640 | else |
| 645 | #endif | 641 | #endif |
| 646 | ret = 1280 - 40 - 8; | 642 | ret = 1280 - 40 - 8; |
| 647 | break; | 643 | break; |
| 648 | #endif | 644 | #endif |
| 649 | default: | 645 | default: |
| 650 | ret = 576 - 20 - 8; | 646 | ret = 576 - 20 - 8; |
| 651 | break; | 647 | break; |
| 652 | } | 648 | } |
| 653 | break; | 649 | break; |
| 654 | case BIO_CTRL_DGRAM_GET_MTU: | 650 | case BIO_CTRL_DGRAM_GET_MTU: |
| 655 | return data->mtu; | 651 | return data->mtu; |
| @@ -661,65 +657,59 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 661 | case BIO_CTRL_DGRAM_SET_CONNECTED: | 657 | case BIO_CTRL_DGRAM_SET_CONNECTED: |
| 662 | to = (struct sockaddr *)ptr; | 658 | to = (struct sockaddr *)ptr; |
| 663 | 659 | ||
| 664 | if ( to != NULL) | 660 | if (to != NULL) { |
| 665 | { | ||
| 666 | data->connected = 1; | 661 | data->connected = 1; |
| 667 | switch (to->sa_family) | 662 | switch (to->sa_family) { |
| 668 | { | ||
| 669 | case AF_INET: | ||
| 670 | memcpy(&data->peer,to,sizeof(data->peer.sa_in)); | ||
| 671 | break; | ||
| 672 | #if OPENSSL_USE_IPV6 | ||
| 673 | case AF_INET6: | ||
| 674 | memcpy(&data->peer,to,sizeof(data->peer.sa_in6)); | ||
| 675 | break; | ||
| 676 | #endif | ||
| 677 | default: | ||
| 678 | memcpy(&data->peer,to,sizeof(data->peer.sa)); | ||
| 679 | break; | ||
| 680 | } | ||
| 681 | } | ||
| 682 | else | ||
| 683 | { | ||
| 684 | data->connected = 0; | ||
| 685 | memset(&(data->peer), 0x00, sizeof(data->peer)); | ||
| 686 | } | ||
| 687 | break; | ||
| 688 | case BIO_CTRL_DGRAM_GET_PEER: | ||
| 689 | switch (data->peer.sa.sa_family) | ||
| 690 | { | ||
| 691 | case AF_INET: | 663 | case AF_INET: |
| 692 | ret=sizeof(data->peer.sa_in); | 664 | memcpy(&data->peer, to, sizeof(data->peer.sa_in)); |
| 693 | break; | 665 | break; |
| 694 | #if OPENSSL_USE_IPV6 | 666 | #if OPENSSL_USE_IPV6 |
| 695 | case AF_INET6: | 667 | case AF_INET6: |
| 696 | ret=sizeof(data->peer.sa_in6); | 668 | memcpy(&data->peer, to, sizeof(data->peer.sa_in6)); |
| 697 | break; | 669 | break; |
| 698 | #endif | 670 | #endif |
| 699 | default: | 671 | default: |
| 700 | ret=sizeof(data->peer.sa); | 672 | memcpy(&data->peer, to, sizeof(data->peer.sa)); |
| 701 | break; | 673 | break; |
| 702 | } | 674 | } |
| 703 | if (num==0 || num>ret) | 675 | } else { |
| 704 | num=ret; | 676 | data->connected = 0; |
| 705 | memcpy(ptr,&data->peer,(ret=num)); | 677 | memset(&(data->peer), 0x00, sizeof(data->peer)); |
| 678 | } | ||
| 679 | break; | ||
| 680 | case BIO_CTRL_DGRAM_GET_PEER: | ||
| 681 | switch (data->peer.sa.sa_family) { | ||
| 682 | case AF_INET: | ||
| 683 | ret = sizeof(data->peer.sa_in); | ||
| 684 | break; | ||
| 685 | #if OPENSSL_USE_IPV6 | ||
| 686 | case AF_INET6: | ||
| 687 | ret = sizeof(data->peer.sa_in6); | ||
| 688 | break; | ||
| 689 | #endif | ||
| 690 | default: | ||
| 691 | ret = sizeof(data->peer.sa); | ||
| 692 | break; | ||
| 693 | } | ||
| 694 | if (num == 0 || num > ret) | ||
| 695 | num = ret; | ||
| 696 | memcpy(ptr, &data->peer, (ret = num)); | ||
| 706 | break; | 697 | break; |
| 707 | case BIO_CTRL_DGRAM_SET_PEER: | 698 | case BIO_CTRL_DGRAM_SET_PEER: |
| 708 | to = (struct sockaddr *) ptr; | 699 | to = (struct sockaddr *) ptr; |
| 709 | switch (to->sa_family) | 700 | switch (to->sa_family) { |
| 710 | { | 701 | case AF_INET: |
| 711 | case AF_INET: | 702 | memcpy(&data->peer, to, sizeof(data->peer.sa_in)); |
| 712 | memcpy(&data->peer,to,sizeof(data->peer.sa_in)); | 703 | break; |
| 713 | break; | ||
| 714 | #if OPENSSL_USE_IPV6 | 704 | #if OPENSSL_USE_IPV6 |
| 715 | case AF_INET6: | 705 | case AF_INET6: |
| 716 | memcpy(&data->peer,to,sizeof(data->peer.sa_in6)); | 706 | memcpy(&data->peer, to, sizeof(data->peer.sa_in6)); |
| 717 | break; | 707 | break; |
| 718 | #endif | 708 | #endif |
| 719 | default: | 709 | default: |
| 720 | memcpy(&data->peer,to,sizeof(data->peer.sa)); | 710 | memcpy(&data->peer, to, sizeof(data->peer.sa)); |
| 721 | break; | 711 | break; |
| 722 | } | 712 | } |
| 723 | break; | 713 | break; |
| 724 | case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT: | 714 | case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT: |
| 725 | memcpy(&(data->next_timeout), ptr, sizeof(struct timeval)); | 715 | memcpy(&(data->next_timeout), ptr, sizeof(struct timeval)); |
| @@ -728,47 +718,53 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 728 | case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT: | 718 | case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT: |
| 729 | #ifdef OPENSSL_SYS_WINDOWS | 719 | #ifdef OPENSSL_SYS_WINDOWS |
| 730 | { | 720 | { |
| 731 | struct timeval *tv = (struct timeval *)ptr; | 721 | struct timeval *tv = (struct timeval *)ptr; |
| 732 | int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; | 722 | int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; |
| 733 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 723 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 734 | (void*)&timeout, sizeof(timeout)) < 0) | 724 | (void*)&timeout, sizeof(timeout)) < 0) { |
| 735 | { perror("setsockopt"); ret = -1; } | 725 | perror("setsockopt"); |
| 726 | ret = -1; | ||
| 727 | } | ||
| 736 | } | 728 | } |
| 737 | #else | 729 | #else |
| 738 | if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr, | 730 | if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr, |
| 739 | sizeof(struct timeval)) < 0) | 731 | sizeof(struct timeval)) < 0) { |
| 740 | { perror("setsockopt"); ret = -1; } | 732 | perror("setsockopt"); |
| 733 | ret = -1; | ||
| 734 | } | ||
| 741 | #endif | 735 | #endif |
| 742 | break; | 736 | break; |
| 743 | case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT: | 737 | case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT: |
| 744 | { | 738 | { |
| 745 | union { size_t s; int i; } sz = {0}; | 739 | union { |
| 740 | size_t s; | ||
| 741 | int i; | ||
| 742 | } sz = {0}; | ||
| 746 | #ifdef OPENSSL_SYS_WINDOWS | 743 | #ifdef OPENSSL_SYS_WINDOWS |
| 747 | int timeout; | 744 | int timeout; |
| 748 | struct timeval *tv = (struct timeval *)ptr; | 745 | struct timeval *tv = (struct timeval *)ptr; |
| 749 | 746 | ||
| 750 | sz.i = sizeof(timeout); | 747 | sz.i = sizeof(timeout); |
| 751 | if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 748 | if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 752 | (void*)&timeout, &sz.i) < 0) | 749 | (void*)&timeout, &sz.i) < 0) { |
| 753 | { perror("getsockopt"); ret = -1; } | 750 | perror("getsockopt"); |
| 754 | else | 751 | ret = -1; |
| 755 | { | 752 | } else { |
| 756 | tv->tv_sec = timeout / 1000; | 753 | tv->tv_sec = timeout / 1000; |
| 757 | tv->tv_usec = (timeout % 1000) * 1000; | 754 | tv->tv_usec = (timeout % 1000) * 1000; |
| 758 | ret = sizeof(*tv); | 755 | ret = sizeof(*tv); |
| 759 | } | 756 | } |
| 760 | #else | 757 | #else |
| 761 | sz.i = sizeof(struct timeval); | 758 | sz.i = sizeof(struct timeval); |
| 762 | if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, | 759 | if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, |
| 763 | ptr, (void *)&sz) < 0) | 760 | ptr, (void *)&sz) < 0) { |
| 764 | { perror("getsockopt"); ret = -1; } | 761 | perror("getsockopt"); |
| 765 | else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) | 762 | ret = -1; |
| 766 | { | 763 | } else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) { |
| 767 | OPENSSL_assert(sz.s<=sizeof(struct timeval)); | 764 | OPENSSL_assert(sz.s <= sizeof(struct timeval)); |
| 768 | ret = (int)sz.s; | 765 | ret = (int)sz.s; |
| 769 | } | 766 | } else |
| 770 | else | 767 | ret = sz.i; |
| 771 | ret = sz.i; | ||
| 772 | #endif | 768 | #endif |
| 773 | } | 769 | } |
| 774 | break; | 770 | break; |
| @@ -777,47 +773,53 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 777 | case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT: | 773 | case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT: |
| 778 | #ifdef OPENSSL_SYS_WINDOWS | 774 | #ifdef OPENSSL_SYS_WINDOWS |
| 779 | { | 775 | { |
| 780 | struct timeval *tv = (struct timeval *)ptr; | 776 | struct timeval *tv = (struct timeval *)ptr; |
| 781 | int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; | 777 | int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000; |
| 782 | if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, | 778 | if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, |
| 783 | (void*)&timeout, sizeof(timeout)) < 0) | 779 | (void*)&timeout, sizeof(timeout)) < 0) { |
| 784 | { perror("setsockopt"); ret = -1; } | 780 | perror("setsockopt"); |
| 781 | ret = -1; | ||
| 782 | } | ||
| 785 | } | 783 | } |
| 786 | #else | 784 | #else |
| 787 | if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr, | 785 | if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr, |
| 788 | sizeof(struct timeval)) < 0) | 786 | sizeof(struct timeval)) < 0) { |
| 789 | { perror("setsockopt"); ret = -1; } | 787 | perror("setsockopt"); |
| 788 | ret = -1; | ||
| 789 | } | ||
| 790 | #endif | 790 | #endif |
| 791 | break; | 791 | break; |
| 792 | case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT: | 792 | case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT: |
| 793 | { | 793 | { |
| 794 | union { size_t s; int i; } sz = {0}; | 794 | union { |
| 795 | size_t s; | ||
| 796 | int i; | ||
| 797 | } sz = {0}; | ||
| 795 | #ifdef OPENSSL_SYS_WINDOWS | 798 | #ifdef OPENSSL_SYS_WINDOWS |
| 796 | int timeout; | 799 | int timeout; |
| 797 | struct timeval *tv = (struct timeval *)ptr; | 800 | struct timeval *tv = (struct timeval *)ptr; |
| 798 | 801 | ||
| 799 | sz.i = sizeof(timeout); | 802 | sz.i = sizeof(timeout); |
| 800 | if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, | 803 | if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, |
| 801 | (void*)&timeout, &sz.i) < 0) | 804 | (void*)&timeout, &sz.i) < 0) { |
| 802 | { perror("getsockopt"); ret = -1; } | 805 | perror("getsockopt"); |
| 803 | else | 806 | ret = -1; |
| 804 | { | 807 | } else { |
| 805 | tv->tv_sec = timeout / 1000; | 808 | tv->tv_sec = timeout / 1000; |
| 806 | tv->tv_usec = (timeout % 1000) * 1000; | 809 | tv->tv_usec = (timeout % 1000) * 1000; |
| 807 | ret = sizeof(*tv); | 810 | ret = sizeof(*tv); |
| 808 | } | 811 | } |
| 809 | #else | 812 | #else |
| 810 | sz.i = sizeof(struct timeval); | 813 | sz.i = sizeof(struct timeval); |
| 811 | if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, | 814 | if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, |
| 812 | ptr, (void *)&sz) < 0) | 815 | ptr, (void *)&sz) < 0) { |
| 813 | { perror("getsockopt"); ret = -1; } | 816 | perror("getsockopt"); |
| 814 | else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) | 817 | ret = -1; |
| 815 | { | 818 | } else if (sizeof(sz.s) != sizeof(sz.i) && sz.i == 0) { |
| 816 | OPENSSL_assert(sz.s<=sizeof(struct timeval)); | 819 | OPENSSL_assert(sz.s <= sizeof(struct timeval)); |
| 817 | ret = (int)sz.s; | 820 | ret = (int)sz.s; |
| 818 | } | 821 | } else |
| 819 | else | 822 | ret = sz.i; |
| 820 | ret = sz.i; | ||
| 821 | #endif | 823 | #endif |
| 822 | } | 824 | } |
| 823 | break; | 825 | break; |
| @@ -826,52 +828,52 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 826 | /* fall-through */ | 828 | /* fall-through */ |
| 827 | case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP: | 829 | case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP: |
| 828 | #ifdef OPENSSL_SYS_WINDOWS | 830 | #ifdef OPENSSL_SYS_WINDOWS |
| 829 | if ( data->_errno == WSAETIMEDOUT) | 831 | if (data->_errno == WSAETIMEDOUT) |
| 830 | #else | 832 | #else |
| 831 | if ( data->_errno == EAGAIN) | 833 | if (data->_errno == EAGAIN) |
| 832 | #endif | 834 | #endif |
| 833 | { | 835 | { |
| 834 | ret = 1; | 836 | ret = 1; |
| 835 | data->_errno = 0; | 837 | data->_errno = 0; |
| 836 | } | 838 | } else |
| 837 | else | ||
| 838 | ret = 0; | 839 | ret = 0; |
| 839 | break; | 840 | break; |
| 840 | #ifdef EMSGSIZE | 841 | #ifdef EMSGSIZE |
| 841 | case BIO_CTRL_DGRAM_MTU_EXCEEDED: | 842 | case BIO_CTRL_DGRAM_MTU_EXCEEDED: |
| 842 | if ( data->_errno == EMSGSIZE) | 843 | if (data->_errno == EMSGSIZE) { |
| 843 | { | ||
| 844 | ret = 1; | 844 | ret = 1; |
| 845 | data->_errno = 0; | 845 | data->_errno = 0; |
| 846 | } | 846 | } else |
| 847 | else | ||
| 848 | ret = 0; | 847 | ret = 0; |
| 849 | break; | 848 | break; |
| 850 | #endif | 849 | #endif |
| 851 | default: | 850 | default: |
| 852 | ret=0; | 851 | ret = 0; |
| 853 | break; | 852 | break; |
| 854 | } | ||
| 855 | return(ret); | ||
| 856 | } | 853 | } |
| 854 | return (ret); | ||
| 855 | } | ||
| 857 | 856 | ||
| 858 | static int dgram_puts(BIO *bp, const char *str) | 857 | static int |
| 859 | { | 858 | dgram_puts(BIO *bp, const char *str) |
| 860 | int n,ret; | 859 | { |
| 860 | int n, ret; | ||
| 861 | 861 | ||
| 862 | n=strlen(str); | 862 | n = strlen(str); |
| 863 | ret=dgram_write(bp,str,n); | 863 | ret = dgram_write(bp, str, n); |
| 864 | return(ret); | 864 | return (ret); |
| 865 | } | 865 | } |
| 866 | 866 | ||
| 867 | #ifndef OPENSSL_NO_SCTP | 867 | #ifndef OPENSSL_NO_SCTP |
| 868 | BIO_METHOD *BIO_s_datagram_sctp(void) | 868 | BIO_METHOD |
| 869 | { | 869 | *BIO_s_datagram_sctp(void) |
| 870 | return(&methods_dgramp_sctp); | 870 | { |
| 871 | } | 871 | return (&methods_dgramp_sctp); |
| 872 | } | ||
| 872 | 873 | ||
| 873 | BIO *BIO_new_dgram_sctp(int fd, int close_flag) | 874 | BIO |
| 874 | { | 875 | *BIO_new_dgram_sctp(int fd, int close_flag) |
| 876 | { | ||
| 875 | BIO *bio; | 877 | BIO *bio; |
| 876 | int ret, optval = 20000; | 878 | int ret, optval = 20000; |
| 877 | int auth_data = 0, auth_forward = 0; | 879 | int auth_data = 0, auth_forward = 0; |
| @@ -887,9 +889,10 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag) | |||
| 887 | #endif | 889 | #endif |
| 888 | #endif | 890 | #endif |
| 889 | 891 | ||
| 890 | bio=BIO_new(BIO_s_datagram_sctp()); | 892 | bio = BIO_new(BIO_s_datagram_sctp()); |
| 891 | if (bio == NULL) return(NULL); | 893 | if (bio == NULL) |
| 892 | BIO_set_fd(bio,fd,close_flag); | 894 | return (NULL); |
| 895 | BIO_set_fd(bio, fd, close_flag); | ||
| 893 | 896 | ||
| 894 | /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */ | 897 | /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */ |
| 895 | auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE; | 898 | auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE; |
| @@ -909,13 +912,14 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag) | |||
| 909 | OPENSSL_assert(ret >= 0); | 912 | OPENSSL_assert(ret >= 0); |
| 910 | 913 | ||
| 911 | for (p = (unsigned char*) authchunks->gauth_chunks; | 914 | for (p = (unsigned char*) authchunks->gauth_chunks; |
| 912 | p < (unsigned char*) authchunks + sockopt_len; | 915 | p < (unsigned char*) authchunks + sockopt_len; |
| 913 | p += sizeof(uint8_t)) | 916 | p += sizeof(uint8_t)) { |
| 914 | { | 917 | if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) |
| 915 | if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) auth_data = 1; | 918 | auth_data = 1; |
| 916 | if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) auth_forward = 1; | 919 | if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) |
| 917 | } | 920 | auth_forward = 1; |
| 918 | 921 | } | |
| 922 | |||
| 919 | OPENSSL_free(authchunks); | 923 | OPENSSL_free(authchunks); |
| 920 | 924 | ||
| 921 | OPENSSL_assert(auth_data); | 925 | OPENSSL_assert(auth_data); |
| @@ -947,20 +951,22 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag) | |||
| 947 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval, sizeof(optval)); | 951 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval, sizeof(optval)); |
| 948 | OPENSSL_assert(ret >= 0); | 952 | OPENSSL_assert(ret >= 0); |
| 949 | 953 | ||
| 950 | return(bio); | 954 | return (bio); |
| 951 | } | 955 | } |
| 952 | 956 | ||
| 953 | int BIO_dgram_is_sctp(BIO *bio) | 957 | int |
| 954 | { | 958 | BIO_dgram_is_sctp(BIO *bio) |
| 959 | { | ||
| 955 | return (BIO_method_type(bio) == BIO_TYPE_DGRAM_SCTP); | 960 | return (BIO_method_type(bio) == BIO_TYPE_DGRAM_SCTP); |
| 956 | } | 961 | } |
| 957 | 962 | ||
| 958 | static int dgram_sctp_new(BIO *bi) | 963 | static int |
| 959 | { | 964 | dgram_sctp_new(BIO *bi) |
| 965 | { | ||
| 960 | bio_dgram_sctp_data *data = NULL; | 966 | bio_dgram_sctp_data *data = NULL; |
| 961 | 967 | ||
| 962 | bi->init=0; | 968 | bi->init = 0; |
| 963 | bi->num=0; | 969 | bi->num = 0; |
| 964 | data = OPENSSL_malloc(sizeof(bio_dgram_sctp_data)); | 970 | data = OPENSSL_malloc(sizeof(bio_dgram_sctp_data)); |
| 965 | if (data == NULL) | 971 | if (data == NULL) |
| 966 | return 0; | 972 | return 0; |
| @@ -968,46 +974,50 @@ static int dgram_sctp_new(BIO *bi) | |||
| 968 | #ifdef SCTP_PR_SCTP_NONE | 974 | #ifdef SCTP_PR_SCTP_NONE |
| 969 | data->prinfo.pr_policy = SCTP_PR_SCTP_NONE; | 975 | data->prinfo.pr_policy = SCTP_PR_SCTP_NONE; |
| 970 | #endif | 976 | #endif |
| 971 | bi->ptr = data; | 977 | bi->ptr = data; |
| 972 | 978 | ||
| 973 | bi->flags=0; | 979 | bi->flags = 0; |
| 974 | return(1); | 980 | return (1); |
| 975 | } | 981 | } |
| 976 | 982 | ||
| 977 | static int dgram_sctp_free(BIO *a) | 983 | static int |
| 978 | { | 984 | dgram_sctp_free(BIO *a) |
| 985 | { | ||
| 979 | bio_dgram_sctp_data *data; | 986 | bio_dgram_sctp_data *data; |
| 980 | 987 | ||
| 981 | if (a == NULL) return(0); | 988 | if (a == NULL) |
| 982 | if ( ! dgram_clear(a)) | 989 | return (0); |
| 990 | if (! dgram_clear(a)) | ||
| 983 | return 0; | 991 | return 0; |
| 984 | 992 | ||
| 985 | data = (bio_dgram_sctp_data *)a->ptr; | 993 | data = (bio_dgram_sctp_data *)a->ptr; |
| 986 | if(data != NULL) OPENSSL_free(data); | 994 | if (data != NULL) |
| 995 | OPENSSL_free(data); | ||
| 987 | 996 | ||
| 988 | return(1); | 997 | return (1); |
| 989 | } | 998 | } |
| 990 | 999 | ||
| 991 | #ifdef SCTP_AUTHENTICATION_EVENT | 1000 | #ifdef SCTP_AUTHENTICATION_EVENT |
| 992 | void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp) | 1001 | void |
| 993 | { | 1002 | dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp) |
| 1003 | { | ||
| 994 | int ret; | 1004 | int ret; |
| 995 | struct sctp_authkey_event* authkeyevent = &snp->sn_auth_event; | 1005 | struct sctp_authkey_event* authkeyevent = &snp->sn_auth_event; |
| 996 | 1006 | ||
| 997 | if (authkeyevent->auth_indication == SCTP_AUTH_FREE_KEY) | 1007 | if (authkeyevent->auth_indication == SCTP_AUTH_FREE_KEY) { |
| 998 | { | ||
| 999 | struct sctp_authkeyid authkeyid; | 1008 | struct sctp_authkeyid authkeyid; |
| 1000 | 1009 | ||
| 1001 | /* delete key */ | 1010 | /* delete key */ |
| 1002 | authkeyid.scact_keynumber = authkeyevent->auth_keynumber; | 1011 | authkeyid.scact_keynumber = authkeyevent->auth_keynumber; |
| 1003 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, | 1012 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, |
| 1004 | &authkeyid, sizeof(struct sctp_authkeyid)); | 1013 | &authkeyid, sizeof(struct sctp_authkeyid)); |
| 1005 | } | ||
| 1006 | } | 1014 | } |
| 1015 | } | ||
| 1007 | #endif | 1016 | #endif |
| 1008 | 1017 | ||
| 1009 | static int dgram_sctp_read(BIO *b, char *out, int outl) | 1018 | static int |
| 1010 | { | 1019 | dgram_sctp_read(BIO *b, char *out, int outl) |
| 1020 | { | ||
| 1011 | int ret = 0, n = 0, i, optval; | 1021 | int ret = 0, n = 0, i, optval; |
| 1012 | socklen_t optlen; | 1022 | socklen_t optlen; |
| 1013 | bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr; | 1023 | bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr; |
| @@ -1017,12 +1027,10 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1017 | struct cmsghdr *cmsg; | 1027 | struct cmsghdr *cmsg; |
| 1018 | char cmsgbuf[512]; | 1028 | char cmsgbuf[512]; |
| 1019 | 1029 | ||
| 1020 | if (out != NULL) | 1030 | if (out != NULL) { |
| 1021 | { | ||
| 1022 | errno = 0; | 1031 | errno = 0; |
| 1023 | 1032 | ||
| 1024 | do | 1033 | do { |
| 1025 | { | ||
| 1026 | memset(&data->rcvinfo, 0x00, sizeof(struct bio_dgram_sctp_rcvinfo)); | 1034 | memset(&data->rcvinfo, 0x00, sizeof(struct bio_dgram_sctp_rcvinfo)); |
| 1027 | iov.iov_base = out; | 1035 | iov.iov_base = out; |
| 1028 | iov.iov_len = outl; | 1036 | iov.iov_len = outl; |
| @@ -1035,15 +1043,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1035 | msg.msg_flags = 0; | 1043 | msg.msg_flags = 0; |
| 1036 | n = recvmsg(b->num, &msg, 0); | 1044 | n = recvmsg(b->num, &msg, 0); |
| 1037 | 1045 | ||
| 1038 | if (msg.msg_controllen > 0) | 1046 | if (msg.msg_controllen > 0) { |
| 1039 | { | 1047 | for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { |
| 1040 | for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) | ||
| 1041 | { | ||
| 1042 | if (cmsg->cmsg_level != IPPROTO_SCTP) | 1048 | if (cmsg->cmsg_level != IPPROTO_SCTP) |
| 1043 | continue; | 1049 | continue; |
| 1044 | #ifdef SCTP_RCVINFO | 1050 | #ifdef SCTP_RCVINFO |
| 1045 | if (cmsg->cmsg_type == SCTP_RCVINFO) | 1051 | if (cmsg->cmsg_type == SCTP_RCVINFO) { |
| 1046 | { | ||
| 1047 | struct sctp_rcvinfo *rcvinfo; | 1052 | struct sctp_rcvinfo *rcvinfo; |
| 1048 | 1053 | ||
| 1049 | rcvinfo = (struct sctp_rcvinfo *)CMSG_DATA(cmsg); | 1054 | rcvinfo = (struct sctp_rcvinfo *)CMSG_DATA(cmsg); |
| @@ -1054,11 +1059,10 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1054 | data->rcvinfo.rcv_tsn = rcvinfo->rcv_tsn; | 1059 | data->rcvinfo.rcv_tsn = rcvinfo->rcv_tsn; |
| 1055 | data->rcvinfo.rcv_cumtsn = rcvinfo->rcv_cumtsn; | 1060 | data->rcvinfo.rcv_cumtsn = rcvinfo->rcv_cumtsn; |
| 1056 | data->rcvinfo.rcv_context = rcvinfo->rcv_context; | 1061 | data->rcvinfo.rcv_context = rcvinfo->rcv_context; |
| 1057 | } | 1062 | } |
| 1058 | #endif | 1063 | #endif |
| 1059 | #ifdef SCTP_SNDRCV | 1064 | #ifdef SCTP_SNDRCV |
| 1060 | if (cmsg->cmsg_type == SCTP_SNDRCV) | 1065 | if (cmsg->cmsg_type == SCTP_SNDRCV) { |
| 1061 | { | ||
| 1062 | struct sctp_sndrcvinfo *sndrcvinfo; | 1066 | struct sctp_sndrcvinfo *sndrcvinfo; |
| 1063 | 1067 | ||
| 1064 | sndrcvinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg); | 1068 | sndrcvinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg); |
| @@ -1069,23 +1073,20 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1069 | data->rcvinfo.rcv_tsn = sndrcvinfo->sinfo_tsn; | 1073 | data->rcvinfo.rcv_tsn = sndrcvinfo->sinfo_tsn; |
| 1070 | data->rcvinfo.rcv_cumtsn = sndrcvinfo->sinfo_cumtsn; | 1074 | data->rcvinfo.rcv_cumtsn = sndrcvinfo->sinfo_cumtsn; |
| 1071 | data->rcvinfo.rcv_context = sndrcvinfo->sinfo_context; | 1075 | data->rcvinfo.rcv_context = sndrcvinfo->sinfo_context; |
| 1072 | } | ||
| 1073 | #endif | ||
| 1074 | } | 1076 | } |
| 1077 | #endif | ||
| 1075 | } | 1078 | } |
| 1079 | } | ||
| 1076 | 1080 | ||
| 1077 | if (n <= 0) | 1081 | if (n <= 0) { |
| 1078 | { | ||
| 1079 | if (n < 0) | 1082 | if (n < 0) |
| 1080 | ret = n; | 1083 | ret = n; |
| 1081 | break; | 1084 | break; |
| 1082 | } | 1085 | } |
| 1083 | 1086 | ||
| 1084 | if (msg.msg_flags & MSG_NOTIFICATION) | 1087 | if (msg.msg_flags & MSG_NOTIFICATION) { |
| 1085 | { | ||
| 1086 | snp = (union sctp_notification*) out; | 1088 | snp = (union sctp_notification*) out; |
| 1087 | if (snp->sn_header.sn_type == SCTP_SENDER_DRY_EVENT) | 1089 | if (snp->sn_header.sn_type == SCTP_SENDER_DRY_EVENT) { |
| 1088 | { | ||
| 1089 | #ifdef SCTP_EVENT | 1090 | #ifdef SCTP_EVENT |
| 1090 | struct sctp_event event; | 1091 | struct sctp_event event; |
| 1091 | #else | 1092 | #else |
| @@ -1095,13 +1096,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1095 | /* If a message has been delayed until the socket | 1096 | /* If a message has been delayed until the socket |
| 1096 | * is dry, it can be sent now. | 1097 | * is dry, it can be sent now. |
| 1097 | */ | 1098 | */ |
| 1098 | if (data->saved_message.length > 0) | 1099 | if (data->saved_message.length > 0) { |
| 1099 | { | ||
| 1100 | dgram_sctp_write(data->saved_message.bio, data->saved_message.data, | 1100 | dgram_sctp_write(data->saved_message.bio, data->saved_message.data, |
| 1101 | data->saved_message.length); | 1101 | data->saved_message.length); |
| 1102 | OPENSSL_free(data->saved_message.data); | 1102 | OPENSSL_free(data->saved_message.data); |
| 1103 | data->saved_message.length = 0; | 1103 | data->saved_message.length = 0; |
| 1104 | } | 1104 | } |
| 1105 | 1105 | ||
| 1106 | /* disable sender dry event */ | 1106 | /* disable sender dry event */ |
| 1107 | #ifdef SCTP_EVENT | 1107 | #ifdef SCTP_EVENT |
| @@ -1121,7 +1121,7 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1121 | i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); | 1121 | i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); |
| 1122 | OPENSSL_assert(i >= 0); | 1122 | OPENSSL_assert(i >= 0); |
| 1123 | #endif | 1123 | #endif |
| 1124 | } | 1124 | } |
| 1125 | 1125 | ||
| 1126 | #ifdef SCTP_AUTHENTICATION_EVENT | 1126 | #ifdef SCTP_AUTHENTICATION_EVENT |
| 1127 | if (snp->sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) | 1127 | if (snp->sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) |
| @@ -1132,14 +1132,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1132 | data->handle_notifications(b, data->notification_context, (void*) out); | 1132 | data->handle_notifications(b, data->notification_context, (void*) out); |
| 1133 | 1133 | ||
| 1134 | memset(out, 0, outl); | 1134 | memset(out, 0, outl); |
| 1135 | } | 1135 | } else |
| 1136 | else | ||
| 1137 | ret += n; | 1136 | ret += n; |
| 1138 | } | 1137 | } |
| 1139 | while ((msg.msg_flags & MSG_NOTIFICATION) && (msg.msg_flags & MSG_EOR) && (ret < outl)); | 1138 | while ((msg.msg_flags & MSG_NOTIFICATION) && (msg.msg_flags & MSG_EOR) && (ret < outl)); |
| 1140 | 1139 | ||
| 1141 | if (ret > 0 && !(msg.msg_flags & MSG_EOR)) | 1140 | if (ret > 0 && !(msg.msg_flags & MSG_EOR)) { |
| 1142 | { | ||
| 1143 | /* Partial message read, this should never happen! */ | 1141 | /* Partial message read, this should never happen! */ |
| 1144 | 1142 | ||
| 1145 | /* The buffer was too small, this means the peer sent | 1143 | /* The buffer was too small, this means the peer sent |
| @@ -1159,8 +1157,8 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1159 | * max record size (2^14 + 2048 + 13) | 1157 | * max record size (2^14 + 2048 + 13) |
| 1160 | */ | 1158 | */ |
| 1161 | optlen = (socklen_t) sizeof(int); | 1159 | optlen = (socklen_t) sizeof(int); |
| 1162 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, | 1160 | ret = getsockopt(b->num, IPPROTO_SCTP, |
| 1163 | &optval, &optlen); | 1161 | SCTP_PARTIAL_DELIVERY_POINT, &optval, &optlen); |
| 1164 | OPENSSL_assert(ret >= 0); | 1162 | OPENSSL_assert(ret >= 0); |
| 1165 | OPENSSL_assert(optval >= 18445); | 1163 | OPENSSL_assert(optval >= 18445); |
| 1166 | 1164 | ||
| @@ -1173,21 +1171,18 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1173 | memset(out, 0, outl); | 1171 | memset(out, 0, outl); |
| 1174 | BIO_set_retry_read(b); | 1172 | BIO_set_retry_read(b); |
| 1175 | return -1; | 1173 | return -1; |
| 1176 | } | 1174 | } |
| 1177 | 1175 | ||
| 1178 | BIO_clear_retry_flags(b); | 1176 | BIO_clear_retry_flags(b); |
| 1179 | if (ret < 0) | 1177 | if (ret < 0) { |
| 1180 | { | 1178 | if (BIO_dgram_should_retry(ret)) { |
| 1181 | if (BIO_dgram_should_retry(ret)) | ||
| 1182 | { | ||
| 1183 | BIO_set_retry_read(b); | 1179 | BIO_set_retry_read(b); |
| 1184 | data->_errno = errno; | 1180 | data->_errno = errno; |
| 1185 | } | ||
| 1186 | } | 1181 | } |
| 1182 | } | ||
| 1187 | 1183 | ||
| 1188 | /* Test if peer uses SCTP-AUTH before continuing */ | 1184 | /* Test if peer uses SCTP-AUTH before continuing */ |
| 1189 | if (!data->peer_auth_tested) | 1185 | if (!data->peer_auth_tested) { |
| 1190 | { | ||
| 1191 | int ii, auth_data = 0, auth_forward = 0; | 1186 | int ii, auth_data = 0, auth_forward = 0; |
| 1192 | unsigned char *p; | 1187 | unsigned char *p; |
| 1193 | struct sctp_authchunks *authchunks; | 1188 | struct sctp_authchunks *authchunks; |
| @@ -1199,29 +1194,30 @@ static int dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1199 | OPENSSL_assert(ii >= 0); | 1194 | OPENSSL_assert(ii >= 0); |
| 1200 | 1195 | ||
| 1201 | for (p = (unsigned char*) authchunks->gauth_chunks; | 1196 | for (p = (unsigned char*) authchunks->gauth_chunks; |
| 1202 | p < (unsigned char*) authchunks + optlen; | 1197 | p < (unsigned char*) authchunks + optlen; |
| 1203 | p += sizeof(uint8_t)) | 1198 | p += sizeof(uint8_t)) { |
| 1204 | { | 1199 | if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) |
| 1205 | if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) auth_data = 1; | 1200 | auth_data = 1; |
| 1206 | if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) auth_forward = 1; | 1201 | if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) |
| 1207 | } | 1202 | auth_forward = 1; |
| 1203 | } | ||
| 1208 | 1204 | ||
| 1209 | OPENSSL_free(authchunks); | 1205 | OPENSSL_free(authchunks); |
| 1210 | 1206 | ||
| 1211 | if (!auth_data || !auth_forward) | 1207 | if (!auth_data || !auth_forward) { |
| 1212 | { | 1208 | BIOerr(BIO_F_DGRAM_SCTP_READ, BIO_R_CONNECT_ERROR); |
| 1213 | BIOerr(BIO_F_DGRAM_SCTP_READ,BIO_R_CONNECT_ERROR); | ||
| 1214 | return -1; | 1209 | return -1; |
| 1215 | } | 1210 | } |
| 1216 | 1211 | ||
| 1217 | data->peer_auth_tested = 1; | 1212 | data->peer_auth_tested = 1; |
| 1218 | } | ||
| 1219 | } | 1213 | } |
| 1220 | return(ret); | ||
| 1221 | } | 1214 | } |
| 1215 | return (ret); | ||
| 1216 | } | ||
| 1222 | 1217 | ||
| 1223 | static int dgram_sctp_write(BIO *b, const char *in, int inl) | 1218 | static int |
| 1224 | { | 1219 | dgram_sctp_write(BIO *b, const char *in, int inl) |
| 1220 | { | ||
| 1225 | int ret; | 1221 | int ret; |
| 1226 | bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr; | 1222 | bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr; |
| 1227 | struct bio_dgram_sctp_sndinfo *sinfo = &(data->sndinfo); | 1223 | struct bio_dgram_sctp_sndinfo *sinfo = &(data->sndinfo); |
| @@ -1256,8 +1252,7 @@ static int dgram_sctp_write(BIO *b, const char *in, int inl) | |||
| 1256 | * socket is not dry yet, we have to save it and send it | 1252 | * socket is not dry yet, we have to save it and send it |
| 1257 | * as soon as the socket gets dry. | 1253 | * as soon as the socket gets dry. |
| 1258 | */ | 1254 | */ |
| 1259 | if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) | 1255 | if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) { |
| 1260 | { | ||
| 1261 | data->saved_message.bio = b; | 1256 | data->saved_message.bio = b; |
| 1262 | data->saved_message.length = inl; | 1257 | data->saved_message.length = inl; |
| 1263 | data->saved_message.data = OPENSSL_malloc(inl); | 1258 | data->saved_message.data = OPENSSL_malloc(inl); |
| @@ -1317,20 +1312,20 @@ static int dgram_sctp_write(BIO *b, const char *in, int inl) | |||
| 1317 | ret = sendmsg(b->num, &msg, 0); | 1312 | ret = sendmsg(b->num, &msg, 0); |
| 1318 | 1313 | ||
| 1319 | BIO_clear_retry_flags(b); | 1314 | BIO_clear_retry_flags(b); |
| 1320 | if (ret <= 0) | 1315 | if (ret <= 0) { |
| 1321 | { | 1316 | if (BIO_dgram_should_retry(ret)) { |
| 1322 | if (BIO_dgram_should_retry(ret)) | 1317 | BIO_set_retry_write(b); |
| 1323 | { | 1318 | |
| 1324 | BIO_set_retry_write(b); | ||
| 1325 | data->_errno = errno; | 1319 | data->_errno = errno; |
| 1326 | } | ||
| 1327 | } | 1320 | } |
| 1328 | return(ret); | ||
| 1329 | } | 1321 | } |
| 1322 | return (ret); | ||
| 1323 | } | ||
| 1330 | 1324 | ||
| 1331 | static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | 1325 | static long |
| 1332 | { | 1326 | dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 1333 | long ret=1; | 1327 | { |
| 1328 | long ret = 1; | ||
| 1334 | bio_dgram_sctp_data *data = NULL; | 1329 | bio_dgram_sctp_data *data = NULL; |
| 1335 | socklen_t sockopt_len = 0; | 1330 | socklen_t sockopt_len = 0; |
| 1336 | struct sctp_authkeyid authkeyid; | 1331 | struct sctp_authkeyid authkeyid; |
| @@ -1338,8 +1333,7 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1338 | 1333 | ||
| 1339 | data = (bio_dgram_sctp_data *)b->ptr; | 1334 | data = (bio_dgram_sctp_data *)b->ptr; |
| 1340 | 1335 | ||
| 1341 | switch (cmd) | 1336 | switch (cmd) { |
| 1342 | { | ||
| 1343 | case BIO_CTRL_DGRAM_QUERY_MTU: | 1337 | case BIO_CTRL_DGRAM_QUERY_MTU: |
| 1344 | /* Set to maximum (2^14) | 1338 | /* Set to maximum (2^14) |
| 1345 | * and ignore user input to enable transport | 1339 | * and ignore user input to enable transport |
| @@ -1384,7 +1378,8 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1384 | /* Get active key */ | 1378 | /* Get active key */ |
| 1385 | sockopt_len = sizeof(struct sctp_authkeyid); | 1379 | sockopt_len = sizeof(struct sctp_authkeyid); |
| 1386 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); | 1380 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); |
| 1387 | if (ret < 0) break; | 1381 | if (ret < 0) |
| 1382 | break; | ||
| 1388 | 1383 | ||
| 1389 | /* Add new key */ | 1384 | /* Add new key */ |
| 1390 | sockopt_len = sizeof(struct sctp_authkey) + 64 * sizeof(uint8_t); | 1385 | sockopt_len = sizeof(struct sctp_authkey) + 64 * sizeof(uint8_t); |
| @@ -1400,12 +1395,14 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1400 | memcpy(&authkey->sca_key[0], ptr, 64 * sizeof(uint8_t)); | 1395 | memcpy(&authkey->sca_key[0], ptr, 64 * sizeof(uint8_t)); |
| 1401 | 1396 | ||
| 1402 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_KEY, authkey, sockopt_len); | 1397 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_KEY, authkey, sockopt_len); |
| 1403 | if (ret < 0) break; | 1398 | if (ret < 0) |
| 1399 | break; | ||
| 1404 | 1400 | ||
| 1405 | /* Reset active key */ | 1401 | /* Reset active key */ |
| 1406 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, | 1402 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, |
| 1407 | &authkeyid, sizeof(struct sctp_authkeyid)); | 1403 | &authkeyid, sizeof(struct sctp_authkeyid)); |
| 1408 | if (ret < 0) break; | 1404 | if (ret < 0) |
| 1405 | break; | ||
| 1409 | 1406 | ||
| 1410 | break; | 1407 | break; |
| 1411 | case BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY: | 1408 | case BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY: |
| @@ -1414,13 +1411,15 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1414 | /* Get active key */ | 1411 | /* Get active key */ |
| 1415 | sockopt_len = sizeof(struct sctp_authkeyid); | 1412 | sockopt_len = sizeof(struct sctp_authkeyid); |
| 1416 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); | 1413 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); |
| 1417 | if (ret < 0) break; | 1414 | if (ret < 0) |
| 1415 | break; | ||
| 1418 | 1416 | ||
| 1419 | /* Set active key */ | 1417 | /* Set active key */ |
| 1420 | authkeyid.scact_keynumber = authkeyid.scact_keynumber + 1; | 1418 | authkeyid.scact_keynumber = authkeyid.scact_keynumber + 1; |
| 1421 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, | 1419 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, |
| 1422 | &authkeyid, sizeof(struct sctp_authkeyid)); | 1420 | &authkeyid, sizeof(struct sctp_authkeyid)); |
| 1423 | if (ret < 0) break; | 1421 | if (ret < 0) |
| 1422 | break; | ||
| 1424 | 1423 | ||
| 1425 | /* CCS has been sent, so remember that and fall through | 1424 | /* CCS has been sent, so remember that and fall through |
| 1426 | * to check if we need to deactivate an old key | 1425 | * to check if we need to deactivate an old key |
| @@ -1435,12 +1434,12 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1435 | data->ccs_rcvd = 1; | 1434 | data->ccs_rcvd = 1; |
| 1436 | 1435 | ||
| 1437 | /* CSS has been both, received and sent, so deactivate an old key */ | 1436 | /* CSS has been both, received and sent, so deactivate an old key */ |
| 1438 | if (data->ccs_rcvd == 1 && data->ccs_sent == 1) | 1437 | if (data->ccs_rcvd == 1 && data->ccs_sent == 1) { |
| 1439 | { | ||
| 1440 | /* Get active key */ | 1438 | /* Get active key */ |
| 1441 | sockopt_len = sizeof(struct sctp_authkeyid); | 1439 | sockopt_len = sizeof(struct sctp_authkeyid); |
| 1442 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); | 1440 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len); |
| 1443 | if (ret < 0) break; | 1441 | if (ret < 0) |
| 1442 | break; | ||
| 1444 | 1443 | ||
| 1445 | /* Deactivate key or delete second last key if | 1444 | /* Deactivate key or delete second last key if |
| 1446 | * SCTP_AUTHENTICATION_EVENT is not available. | 1445 | * SCTP_AUTHENTICATION_EVENT is not available. |
| @@ -1449,22 +1448,23 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1449 | #ifdef SCTP_AUTH_DEACTIVATE_KEY | 1448 | #ifdef SCTP_AUTH_DEACTIVATE_KEY |
| 1450 | sockopt_len = sizeof(struct sctp_authkeyid); | 1449 | sockopt_len = sizeof(struct sctp_authkeyid); |
| 1451 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY, | 1450 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY, |
| 1452 | &authkeyid, sockopt_len); | 1451 | &authkeyid, sockopt_len); |
| 1453 | if (ret < 0) break; | 1452 | if (ret < 0) |
| 1453 | break; | ||
| 1454 | #endif | 1454 | #endif |
| 1455 | #ifndef SCTP_AUTHENTICATION_EVENT | 1455 | #ifndef SCTP_AUTHENTICATION_EVENT |
| 1456 | if (authkeyid.scact_keynumber > 0) | 1456 | if (authkeyid.scact_keynumber > 0) { |
| 1457 | { | ||
| 1458 | authkeyid.scact_keynumber = authkeyid.scact_keynumber - 1; | 1457 | authkeyid.scact_keynumber = authkeyid.scact_keynumber - 1; |
| 1459 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, | 1458 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, |
| 1460 | &authkeyid, sizeof(struct sctp_authkeyid)); | 1459 | &authkeyid, sizeof(struct sctp_authkeyid)); |
| 1461 | if (ret < 0) break; | 1460 | if (ret < 0) |
| 1462 | } | 1461 | break; |
| 1462 | } | ||
| 1463 | #endif | 1463 | #endif |
| 1464 | 1464 | ||
| 1465 | data->ccs_rcvd = 0; | 1465 | data->ccs_rcvd = 0; |
| 1466 | data->ccs_sent = 0; | 1466 | data->ccs_sent = 0; |
| 1467 | } | 1467 | } |
| 1468 | break; | 1468 | break; |
| 1469 | case BIO_CTRL_DGRAM_SCTP_GET_SNDINFO: | 1469 | case BIO_CTRL_DGRAM_SCTP_GET_SNDINFO: |
| 1470 | /* Returns the size of the copied struct. */ | 1470 | /* Returns the size of the copied struct. */ |
| @@ -1524,30 +1524,30 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 1524 | /* Pass to default ctrl function to | 1524 | /* Pass to default ctrl function to |
| 1525 | * process SCTP unspecific commands | 1525 | * process SCTP unspecific commands |
| 1526 | */ | 1526 | */ |
| 1527 | ret=dgram_ctrl(b, cmd, num, ptr); | 1527 | ret = dgram_ctrl(b, cmd, num, ptr); |
| 1528 | break; | 1528 | break; |
| 1529 | } | ||
| 1530 | return(ret); | ||
| 1531 | } | 1529 | } |
| 1530 | return (ret); | ||
| 1531 | } | ||
| 1532 | 1532 | ||
| 1533 | int BIO_dgram_sctp_notification_cb(BIO *b, | 1533 | int |
| 1534 | void (*handle_notifications)(BIO *bio, void *context, void *buf), | 1534 | BIO_dgram_sctp_notification_cb(BIO *b, |
| 1535 | void *context) | 1535 | void (*handle_notifications)(BIO *bio, void *context, void *buf), |
| 1536 | { | 1536 | void *context) |
| 1537 | { | ||
| 1537 | bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr; | 1538 | bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr; |
| 1538 | 1539 | ||
| 1539 | if (handle_notifications != NULL) | 1540 | if (handle_notifications != NULL) { |
| 1540 | { | ||
| 1541 | data->handle_notifications = handle_notifications; | 1541 | data->handle_notifications = handle_notifications; |
| 1542 | data->notification_context = context; | 1542 | data->notification_context = context; |
| 1543 | } | 1543 | } else |
| 1544 | else | ||
| 1545 | return -1; | 1544 | return -1; |
| 1546 | 1545 | ||
| 1547 | return 0; | 1546 | return 0; |
| 1548 | } | 1547 | } |
| 1549 | 1548 | ||
| 1550 | int BIO_dgram_sctp_wait_for_dry(BIO *b) | 1549 | int |
| 1550 | BIO_dgram_sctp_wait_for_dry(BIO *b) | ||
| 1551 | { | 1551 | { |
| 1552 | int is_dry = 0; | 1552 | int is_dry = 0; |
| 1553 | int n, sockflags, ret; | 1553 | int n, sockflags, ret; |
| @@ -1574,9 +1574,9 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b) | |||
| 1574 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize); | 1574 | ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize); |
| 1575 | if (ret < 0) | 1575 | if (ret < 0) |
| 1576 | return -1; | 1576 | return -1; |
| 1577 | 1577 | ||
| 1578 | event.sctp_sender_dry_event = 1; | 1578 | event.sctp_sender_dry_event = 1; |
| 1579 | 1579 | ||
| 1580 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); | 1580 | ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); |
| 1581 | #endif | 1581 | #endif |
| 1582 | if (ret < 0) | 1582 | if (ret < 0) |
| @@ -1595,17 +1595,15 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b) | |||
| 1595 | msg.msg_flags = 0; | 1595 | msg.msg_flags = 0; |
| 1596 | 1596 | ||
| 1597 | n = recvmsg(b->num, &msg, MSG_PEEK); | 1597 | n = recvmsg(b->num, &msg, MSG_PEEK); |
| 1598 | if (n <= 0) | 1598 | if (n <= 0) { |
| 1599 | { | ||
| 1600 | if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) | 1599 | if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) |
| 1601 | return -1; | 1600 | return -1; |
| 1602 | else | 1601 | else |
| 1603 | return 0; | 1602 | return 0; |
| 1604 | } | 1603 | } |
| 1605 | 1604 | ||
| 1606 | /* if we find a notification, process it and try again if necessary */ | 1605 | /* if we find a notification, process it and try again if necessary */ |
| 1607 | while (msg.msg_flags & MSG_NOTIFICATION) | 1606 | while (msg.msg_flags & MSG_NOTIFICATION) { |
| 1608 | { | ||
| 1609 | memset(&snp, 0x00, sizeof(union sctp_notification)); | 1607 | memset(&snp, 0x00, sizeof(union sctp_notification)); |
| 1610 | iov.iov_base = (char *)&snp; | 1608 | iov.iov_base = (char *)&snp; |
| 1611 | iov.iov_len = sizeof(union sctp_notification); | 1609 | iov.iov_len = sizeof(union sctp_notification); |
| @@ -1618,16 +1616,14 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b) | |||
| 1618 | msg.msg_flags = 0; | 1616 | msg.msg_flags = 0; |
| 1619 | 1617 | ||
| 1620 | n = recvmsg(b->num, &msg, 0); | 1618 | n = recvmsg(b->num, &msg, 0); |
| 1621 | if (n <= 0) | 1619 | if (n <= 0) { |
| 1622 | { | ||
| 1623 | if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) | 1620 | if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) |
| 1624 | return -1; | 1621 | return -1; |
| 1625 | else | 1622 | else |
| 1626 | return is_dry; | 1623 | return is_dry; |
| 1627 | } | 1624 | } |
| 1628 | 1625 | ||
| 1629 | if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT) | 1626 | if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT) { |
| 1630 | { | ||
| 1631 | is_dry = 1; | 1627 | is_dry = 1; |
| 1632 | 1628 | ||
| 1633 | /* disable sender dry event */ | 1629 | /* disable sender dry event */ |
| @@ -1649,7 +1645,7 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b) | |||
| 1649 | #endif | 1645 | #endif |
| 1650 | if (ret < 0) | 1646 | if (ret < 0) |
| 1651 | return -1; | 1647 | return -1; |
| 1652 | } | 1648 | } |
| 1653 | 1649 | ||
| 1654 | #ifdef SCTP_AUTHENTICATION_EVENT | 1650 | #ifdef SCTP_AUTHENTICATION_EVENT |
| 1655 | if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) | 1651 | if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) |
| @@ -1672,34 +1668,32 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b) | |||
| 1672 | msg.msg_flags = 0; | 1668 | msg.msg_flags = 0; |
| 1673 | 1669 | ||
| 1674 | /* if we have seen the dry already, don't wait */ | 1670 | /* if we have seen the dry already, don't wait */ |
| 1675 | if (is_dry) | 1671 | if (is_dry) { |
| 1676 | { | ||
| 1677 | sockflags = fcntl(b->num, F_GETFL, 0); | 1672 | sockflags = fcntl(b->num, F_GETFL, 0); |
| 1678 | fcntl(b->num, F_SETFL, O_NONBLOCK); | 1673 | fcntl(b->num, F_SETFL, O_NONBLOCK); |
| 1679 | } | 1674 | } |
| 1680 | 1675 | ||
| 1681 | n = recvmsg(b->num, &msg, MSG_PEEK); | 1676 | n = recvmsg(b->num, &msg, MSG_PEEK); |
| 1682 | 1677 | ||
| 1683 | if (is_dry) | 1678 | if (is_dry) { |
| 1684 | { | ||
| 1685 | fcntl(b->num, F_SETFL, sockflags); | 1679 | fcntl(b->num, F_SETFL, sockflags); |
| 1686 | } | 1680 | } |
| 1687 | 1681 | ||
| 1688 | if (n <= 0) | 1682 | if (n <= 0) { |
| 1689 | { | ||
| 1690 | if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) | 1683 | if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK)) |
| 1691 | return -1; | 1684 | return -1; |
| 1692 | else | 1685 | else |
| 1693 | return is_dry; | 1686 | return is_dry; |
| 1694 | } | ||
| 1695 | } | 1687 | } |
| 1688 | } | ||
| 1696 | 1689 | ||
| 1697 | /* read anything else */ | 1690 | /* read anything else */ |
| 1698 | return is_dry; | 1691 | return is_dry; |
| 1699 | } | 1692 | } |
| 1700 | 1693 | ||
| 1701 | int BIO_dgram_sctp_msg_waiting(BIO *b) | 1694 | int |
| 1702 | { | 1695 | BIO_dgram_sctp_msg_waiting(BIO *b) |
| 1696 | { | ||
| 1703 | int n, sockflags; | 1697 | int n, sockflags; |
| 1704 | union sctp_notification snp; | 1698 | union sctp_notification snp; |
| 1705 | struct msghdr msg; | 1699 | struct msghdr msg; |
| @@ -1708,7 +1702,7 @@ int BIO_dgram_sctp_msg_waiting(BIO *b) | |||
| 1708 | 1702 | ||
| 1709 | /* Check if there are any messages waiting to be read */ | 1703 | /* Check if there are any messages waiting to be read */ |
| 1710 | do | 1704 | do |
| 1711 | { | 1705 | { |
| 1712 | memset(&snp, 0x00, sizeof(union sctp_notification)); | 1706 | memset(&snp, 0x00, sizeof(union sctp_notification)); |
| 1713 | iov.iov_base = (char *)&snp; | 1707 | iov.iov_base = (char *)&snp; |
| 1714 | iov.iov_len = sizeof(union sctp_notification); | 1708 | iov.iov_len = sizeof(union sctp_notification); |
| @@ -1726,8 +1720,7 @@ int BIO_dgram_sctp_msg_waiting(BIO *b) | |||
| 1726 | fcntl(b->num, F_SETFL, sockflags); | 1720 | fcntl(b->num, F_SETFL, sockflags); |
| 1727 | 1721 | ||
| 1728 | /* if notification, process and try again */ | 1722 | /* if notification, process and try again */ |
| 1729 | if (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)) | 1723 | if (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)) { |
| 1730 | { | ||
| 1731 | #ifdef SCTP_AUTHENTICATION_EVENT | 1724 | #ifdef SCTP_AUTHENTICATION_EVENT |
| 1732 | if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) | 1725 | if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT) |
| 1733 | dgram_sctp_handle_auth_free_key_event(b, &snp); | 1726 | dgram_sctp_handle_auth_free_key_event(b, &snp); |
| @@ -1747,34 +1740,35 @@ int BIO_dgram_sctp_msg_waiting(BIO *b) | |||
| 1747 | 1740 | ||
| 1748 | if (data->handle_notifications != NULL) | 1741 | if (data->handle_notifications != NULL) |
| 1749 | data->handle_notifications(b, data->notification_context, (void*) &snp); | 1742 | data->handle_notifications(b, data->notification_context, (void*) &snp); |
| 1750 | } | 1743 | } |
| 1751 | 1744 | ||
| 1752 | } while (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)); | 1745 | } while (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)); |
| 1753 | 1746 | ||
| 1754 | /* Return 1 if there is a message to be read, return 0 otherwise. */ | 1747 | /* Return 1 if there is a message to be read, return 0 otherwise. */ |
| 1755 | if (n > 0) | 1748 | if (n > 0) |
| 1756 | return 1; | 1749 | return 1; |
| 1757 | else | 1750 | else |
| 1758 | return 0; | 1751 | return 0; |
| 1759 | } | 1752 | } |
| 1760 | 1753 | ||
| 1761 | static int dgram_sctp_puts(BIO *bp, const char *str) | 1754 | static int |
| 1762 | { | 1755 | dgram_sctp_puts(BIO *bp, const char *str) |
| 1763 | int n,ret; | 1756 | { |
| 1757 | int n, ret; | ||
| 1764 | 1758 | ||
| 1765 | n=strlen(str); | 1759 | n = strlen(str); |
| 1766 | ret=dgram_sctp_write(bp,str,n); | 1760 | ret = dgram_sctp_write(bp, str, n); |
| 1767 | return(ret); | 1761 | return (ret); |
| 1768 | } | 1762 | } |
| 1769 | #endif | 1763 | #endif |
| 1770 | 1764 | ||
| 1771 | static int BIO_dgram_should_retry(int i) | 1765 | static int |
| 1772 | { | 1766 | BIO_dgram_should_retry(int i) |
| 1767 | { | ||
| 1773 | int err; | 1768 | int err; |
| 1774 | 1769 | ||
| 1775 | if ((i == 0) || (i == -1)) | 1770 | if ((i == 0) || (i == -1)) { |
| 1776 | { | 1771 | err = errno; |
| 1777 | err=errno; | ||
| 1778 | 1772 | ||
| 1779 | #if defined(OPENSSL_SYS_WINDOWS) | 1773 | #if defined(OPENSSL_SYS_WINDOWS) |
| 1780 | /* If the socket return value (i) is -1 | 1774 | /* If the socket return value (i) is -1 |
| @@ -1785,15 +1779,15 @@ static int BIO_dgram_should_retry(int i) | |||
| 1785 | */ | 1779 | */ |
| 1786 | #endif | 1780 | #endif |
| 1787 | 1781 | ||
| 1788 | return(BIO_dgram_non_fatal_error(err)); | 1782 | return (BIO_dgram_non_fatal_error(err)); |
| 1789 | } | ||
| 1790 | return(0); | ||
| 1791 | } | 1783 | } |
| 1784 | return (0); | ||
| 1785 | } | ||
| 1792 | 1786 | ||
| 1793 | int BIO_dgram_non_fatal_error(int err) | 1787 | int |
| 1794 | { | 1788 | BIO_dgram_non_fatal_error(int err) |
| 1795 | switch (err) | 1789 | { |
| 1796 | { | 1790 | switch (err) { |
| 1797 | #if defined(OPENSSL_SYS_WINDOWS) | 1791 | #if defined(OPENSSL_SYS_WINDOWS) |
| 1798 | # if defined(WSAEWOULDBLOCK) | 1792 | # if defined(WSAEWOULDBLOCK) |
| 1799 | case WSAEWOULDBLOCK: | 1793 | case WSAEWOULDBLOCK: |
| @@ -1838,17 +1832,17 @@ int BIO_dgram_non_fatal_error(int err) | |||
| 1838 | case EALREADY: | 1832 | case EALREADY: |
| 1839 | #endif | 1833 | #endif |
| 1840 | 1834 | ||
| 1841 | return(1); | 1835 | return (1); |
| 1842 | /* break; */ | 1836 | /* break; */ |
| 1843 | default: | 1837 | default: |
| 1844 | break; | 1838 | break; |
| 1845 | } | ||
| 1846 | return(0); | ||
| 1847 | } | 1839 | } |
| 1840 | return (0); | ||
| 1841 | } | ||
| 1848 | 1842 | ||
| 1849 | static void get_current_time(struct timeval *t) | 1843 | static void |
| 1850 | { | 1844 | get_current_time(struct timeval *t) { |
| 1851 | gettimeofday(t, NULL); | 1845 | gettimeofday(t, NULL); |
| 1852 | } | 1846 | } |
| 1853 | 1847 | ||
| 1854 | #endif | 1848 | #endif |
diff --git a/src/lib/libssl/src/crypto/bio/bss_fd.c b/src/lib/libssl/src/crypto/bio/bss_fd.c index ab18a56310..35ddd61359 100644 --- a/src/lib/libssl/src/crypto/bio/bss_fd.c +++ b/src/lib/libssl/src/crypto/bio/bss_fd.c | |||
| @@ -90,9 +90,8 @@ static int fd_new(BIO *h); | |||
| 90 | static int fd_free(BIO *data); | 90 | static int fd_free(BIO *data); |
| 91 | int BIO_fd_should_retry(int s); | 91 | int BIO_fd_should_retry(int s); |
| 92 | 92 | ||
| 93 | static BIO_METHOD methods_fdp= | 93 | static BIO_METHOD methods_fdp = { |
| 94 | { | 94 | BIO_TYPE_FD, "file descriptor", |
| 95 | BIO_TYPE_FD,"file descriptor", | ||
| 96 | fd_write, | 95 | fd_write, |
| 97 | fd_read, | 96 | fd_read, |
| 98 | fd_puts, | 97 | fd_puts, |
| @@ -101,178 +100,182 @@ static BIO_METHOD methods_fdp= | |||
| 101 | fd_new, | 100 | fd_new, |
| 102 | fd_free, | 101 | fd_free, |
| 103 | NULL, | 102 | NULL, |
| 104 | }; | 103 | }; |
| 105 | 104 | ||
| 106 | BIO_METHOD *BIO_s_fd(void) | 105 | BIO_METHOD |
| 107 | { | 106 | *BIO_s_fd(void) |
| 108 | return(&methods_fdp); | 107 | { |
| 109 | } | 108 | return (&methods_fdp); |
| 109 | } | ||
| 110 | 110 | ||
| 111 | BIO *BIO_new_fd(int fd,int close_flag) | 111 | BIO |
| 112 | { | 112 | *BIO_new_fd(int fd, int close_flag) |
| 113 | { | ||
| 113 | BIO *ret; | 114 | BIO *ret; |
| 114 | ret=BIO_new(BIO_s_fd()); | 115 | ret = BIO_new(BIO_s_fd()); |
| 115 | if (ret == NULL) return(NULL); | 116 | if (ret == NULL) |
| 116 | BIO_set_fd(ret,fd,close_flag); | 117 | return (NULL); |
| 117 | return(ret); | 118 | BIO_set_fd(ret, fd, close_flag); |
| 118 | } | 119 | return (ret); |
| 120 | } | ||
| 119 | 121 | ||
| 120 | static int fd_new(BIO *bi) | 122 | static int |
| 121 | { | 123 | fd_new(BIO *bi) |
| 122 | bi->init=0; | 124 | { |
| 123 | bi->num=-1; | 125 | bi->init = 0; |
| 124 | bi->ptr=NULL; | 126 | bi->num = -1; |
| 127 | bi->ptr = NULL; | ||
| 125 | bi->flags=BIO_FLAGS_UPLINK; /* essentially redundant */ | 128 | bi->flags=BIO_FLAGS_UPLINK; /* essentially redundant */ |
| 126 | return(1); | 129 | return (1); |
| 127 | } | 130 | } |
| 128 | 131 | ||
| 129 | static int fd_free(BIO *a) | 132 | static int |
| 130 | { | 133 | fd_free(BIO *a) |
| 131 | if (a == NULL) return(0); | 134 | { |
| 132 | if (a->shutdown) | 135 | if (a == NULL) |
| 133 | { | 136 | return (0); |
| 134 | if (a->init) | 137 | if (a->shutdown) { |
| 135 | { | 138 | if (a->init) { |
| 136 | UP_close(a->num); | 139 | UP_close(a->num); |
| 137 | } | ||
| 138 | a->init=0; | ||
| 139 | a->flags=BIO_FLAGS_UPLINK; | ||
| 140 | } | 140 | } |
| 141 | return(1); | 141 | a->init = 0; |
| 142 | a->flags = BIO_FLAGS_UPLINK; | ||
| 142 | } | 143 | } |
| 143 | 144 | return (1); | |
| 144 | static int fd_read(BIO *b, char *out,int outl) | 145 | } |
| 145 | { | ||
| 146 | int ret=0; | ||
| 147 | 146 | ||
| 148 | if (out != NULL) | 147 | static int |
| 149 | { | 148 | fd_read(BIO *b, char *out, int outl) |
| 149 | { | ||
| 150 | int ret = 0; | ||
| 151 | |||
| 152 | if (out != NULL) { | ||
| 150 | errno = 0; | 153 | errno = 0; |
| 151 | ret=UP_read(b->num,out,outl); | 154 | ret = UP_read(b->num, out, outl); |
| 152 | BIO_clear_retry_flags(b); | 155 | BIO_clear_retry_flags(b); |
| 153 | if (ret <= 0) | 156 | if (ret <= 0) { |
| 154 | { | ||
| 155 | if (BIO_fd_should_retry(ret)) | 157 | if (BIO_fd_should_retry(ret)) |
| 156 | BIO_set_retry_read(b); | 158 | BIO_set_retry_read(b); |
| 157 | } | ||
| 158 | } | 159 | } |
| 159 | return(ret); | ||
| 160 | } | 160 | } |
| 161 | return (ret); | ||
| 162 | } | ||
| 161 | 163 | ||
| 162 | static int fd_write(BIO *b, const char *in, int inl) | 164 | static int |
| 163 | { | 165 | fd_write(BIO *b, const char *in, int inl) |
| 166 | { | ||
| 164 | int ret; | 167 | int ret; |
| 165 | errno = 0; | 168 | errno = 0; |
| 166 | ret=UP_write(b->num,in,inl); | 169 | ret = UP_write(b->num, in, inl); |
| 167 | BIO_clear_retry_flags(b); | 170 | BIO_clear_retry_flags(b); |
| 168 | if (ret <= 0) | 171 | if (ret <= 0) { |
| 169 | { | ||
| 170 | if (BIO_fd_should_retry(ret)) | 172 | if (BIO_fd_should_retry(ret)) |
| 171 | BIO_set_retry_write(b); | 173 | BIO_set_retry_write(b); |
| 172 | } | ||
| 173 | return(ret); | ||
| 174 | } | 174 | } |
| 175 | return (ret); | ||
| 176 | } | ||
| 175 | 177 | ||
| 176 | static long fd_ctrl(BIO *b, int cmd, long num, void *ptr) | 178 | static long |
| 177 | { | 179 | fd_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 178 | long ret=1; | 180 | { |
| 181 | long ret = 1; | ||
| 179 | int *ip; | 182 | int *ip; |
| 180 | 183 | ||
| 181 | switch (cmd) | 184 | switch (cmd) { |
| 182 | { | ||
| 183 | case BIO_CTRL_RESET: | 185 | case BIO_CTRL_RESET: |
| 184 | num=0; | 186 | num = 0; |
| 185 | case BIO_C_FILE_SEEK: | 187 | case BIO_C_FILE_SEEK: |
| 186 | ret=(long)UP_lseek(b->num,num,0); | 188 | ret = (long)UP_lseek(b->num, num, 0); |
| 187 | break; | 189 | break; |
| 188 | case BIO_C_FILE_TELL: | 190 | case BIO_C_FILE_TELL: |
| 189 | case BIO_CTRL_INFO: | 191 | case BIO_CTRL_INFO: |
| 190 | ret=(long)UP_lseek(b->num,0,1); | 192 | ret = (long)UP_lseek(b->num, 0, 1); |
| 191 | break; | 193 | break; |
| 192 | case BIO_C_SET_FD: | 194 | case BIO_C_SET_FD: |
| 193 | fd_free(b); | 195 | fd_free(b); |
| 194 | b->num= *((int *)ptr); | 196 | b->num= *((int *)ptr); |
| 195 | b->shutdown=(int)num; | 197 | b->shutdown = (int)num; |
| 196 | b->init=1; | 198 | b->init = 1; |
| 197 | break; | 199 | break; |
| 198 | case BIO_C_GET_FD: | 200 | case BIO_C_GET_FD: |
| 199 | if (b->init) | 201 | if (b->init) { |
| 200 | { | 202 | ip = (int *)ptr; |
| 201 | ip=(int *)ptr; | 203 | if (ip != NULL) |
| 202 | if (ip != NULL) *ip=b->num; | 204 | *ip = b->num; |
| 203 | ret=b->num; | 205 | ret = b->num; |
| 204 | } | 206 | } else |
| 205 | else | 207 | ret = -1; |
| 206 | ret= -1; | ||
| 207 | break; | 208 | break; |
| 208 | case BIO_CTRL_GET_CLOSE: | 209 | case BIO_CTRL_GET_CLOSE: |
| 209 | ret=b->shutdown; | 210 | ret = b->shutdown; |
| 210 | break; | 211 | break; |
| 211 | case BIO_CTRL_SET_CLOSE: | 212 | case BIO_CTRL_SET_CLOSE: |
| 212 | b->shutdown=(int)num; | 213 | b->shutdown = (int)num; |
| 213 | break; | 214 | break; |
| 214 | case BIO_CTRL_PENDING: | 215 | case BIO_CTRL_PENDING: |
| 215 | case BIO_CTRL_WPENDING: | 216 | case BIO_CTRL_WPENDING: |
| 216 | ret=0; | 217 | ret = 0; |
| 217 | break; | 218 | break; |
| 218 | case BIO_CTRL_DUP: | 219 | case BIO_CTRL_DUP: |
| 219 | case BIO_CTRL_FLUSH: | 220 | case BIO_CTRL_FLUSH: |
| 220 | ret=1; | 221 | ret = 1; |
| 221 | break; | 222 | break; |
| 222 | default: | 223 | default: |
| 223 | ret=0; | 224 | ret = 0; |
| 224 | break; | 225 | break; |
| 225 | } | ||
| 226 | return(ret); | ||
| 227 | } | 226 | } |
| 227 | return (ret); | ||
| 228 | } | ||
| 228 | 229 | ||
| 229 | static int fd_puts(BIO *bp, const char *str) | 230 | static int |
| 230 | { | 231 | fd_puts(BIO *bp, const char *str) |
| 231 | int n,ret; | 232 | { |
| 233 | int n, ret; | ||
| 232 | 234 | ||
| 233 | n=strlen(str); | 235 | n = strlen(str); |
| 234 | ret=fd_write(bp,str,n); | 236 | ret = fd_write(bp, str, n); |
| 235 | return(ret); | 237 | return (ret); |
| 236 | } | 238 | } |
| 237 | 239 | ||
| 238 | static int fd_gets(BIO *bp, char *buf, int size) | 240 | static int |
| 239 | { | 241 | fd_gets(BIO *bp, char *buf, int size) |
| 240 | int ret=0; | 242 | { |
| 241 | char *ptr=buf; | 243 | int ret = 0; |
| 242 | char *end=buf+size-1; | 244 | char *ptr = buf; |
| 245 | char *end = buf + size - 1; | ||
| 243 | 246 | ||
| 244 | while ( (ptr < end) && (fd_read(bp, ptr, 1) > 0) && (ptr[0] != '\n') ) | 247 | while ((ptr < end) && (fd_read(bp, ptr, 1) > 0) && (ptr[0] != '\n')) |
| 245 | ptr++; | 248 | ptr++; |
| 246 | 249 | ||
| 247 | ptr[0]='\0'; | 250 | ptr[0] = '\0'; |
| 248 | 251 | ||
| 249 | if (buf[0] != '\0') | 252 | if (buf[0] != '\0') |
| 250 | ret=strlen(buf); | 253 | ret = strlen(buf); |
| 251 | return(ret); | 254 | return (ret); |
| 252 | } | 255 | } |
| 253 | 256 | ||
| 254 | int BIO_fd_should_retry(int i) | 257 | int |
| 255 | { | 258 | BIO_fd_should_retry(int i) |
| 259 | { | ||
| 256 | int err; | 260 | int err; |
| 257 | 261 | ||
| 258 | if ((i == 0) || (i == -1)) | 262 | if ((i == 0) || (i == -1)) { |
| 259 | { | 263 | err = errno; |
| 260 | err=errno; | ||
| 261 | 264 | ||
| 262 | #if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ | 265 | #if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ |
| 263 | if ((i == -1) && (err == 0)) | 266 | if ((i == -1) && (err == 0)) |
| 264 | return(1); | 267 | return (1); |
| 265 | #endif | 268 | #endif |
| 266 | 269 | ||
| 267 | return(BIO_fd_non_fatal_error(err)); | 270 | return (BIO_fd_non_fatal_error(err)); |
| 268 | } | ||
| 269 | return(0); | ||
| 270 | } | 271 | } |
| 272 | return (0); | ||
| 273 | } | ||
| 271 | 274 | ||
| 272 | int BIO_fd_non_fatal_error(int err) | 275 | int |
| 273 | { | 276 | BIO_fd_non_fatal_error(int err) |
| 274 | switch (err) | 277 | { |
| 275 | { | 278 | switch (err) { |
| 276 | 279 | ||
| 277 | #ifdef EWOULDBLOCK | 280 | #ifdef EWOULDBLOCK |
| 278 | # ifdef WSAEWOULDBLOCK | 281 | # ifdef WSAEWOULDBLOCK |
| @@ -309,11 +312,11 @@ int BIO_fd_non_fatal_error(int err) | |||
| 309 | #ifdef EALREADY | 312 | #ifdef EALREADY |
| 310 | case EALREADY: | 313 | case EALREADY: |
| 311 | #endif | 314 | #endif |
| 312 | return(1); | 315 | return (1); |
| 313 | /* break; */ | 316 | /* break; */ |
| 314 | default: | 317 | default: |
| 315 | break; | 318 | break; |
| 316 | } | ||
| 317 | return(0); | ||
| 318 | } | 319 | } |
| 320 | return (0); | ||
| 321 | } | ||
| 319 | #endif | 322 | #endif |
diff --git a/src/lib/libssl/src/crypto/bio/bss_file.c b/src/lib/libssl/src/crypto/bio/bss_file.c index 638572ab7f..794f503a69 100644 --- a/src/lib/libssl/src/crypto/bio/bss_file.c +++ b/src/lib/libssl/src/crypto/bio/bss_file.c | |||
| @@ -102,8 +102,8 @@ static int file_gets(BIO *h, char *str, int size); | |||
| 102 | static long file_ctrl(BIO *h, int cmd, long arg1, void *arg2); | 102 | static long file_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 103 | static int file_new(BIO *h); | 103 | static int file_new(BIO *h); |
| 104 | static int file_free(BIO *data); | 104 | static int file_free(BIO *data); |
| 105 | static BIO_METHOD methods_filep= | 105 | |
| 106 | { | 106 | static BIO_METHOD methods_filep = { |
| 107 | BIO_TYPE_FILE, | 107 | BIO_TYPE_FILE, |
| 108 | "FILE pointer", | 108 | "FILE pointer", |
| 109 | file_write, | 109 | file_write, |
| @@ -114,15 +114,16 @@ static BIO_METHOD methods_filep= | |||
| 114 | file_new, | 114 | file_new, |
| 115 | file_free, | 115 | file_free, |
| 116 | NULL, | 116 | NULL, |
| 117 | }; | 117 | }; |
| 118 | 118 | ||
| 119 | BIO *BIO_new_file(const char *filename, const char *mode) | 119 | BIO |
| 120 | { | 120 | *BIO_new_file(const char *filename, const char *mode) |
| 121 | { | ||
| 121 | BIO *ret; | 122 | BIO *ret; |
| 122 | FILE *file=NULL; | 123 | FILE *file = NULL; |
| 123 | 124 | ||
| 124 | #if defined(_WIN32) && defined(CP_UTF8) | 125 | #if defined(_WIN32) && defined(CP_UTF8) |
| 125 | int sz, len_0 = (int)strlen(filename)+1; | 126 | int sz, len_0 = (int)strlen(filename) + 1; |
| 126 | DWORD flags; | 127 | DWORD flags; |
| 127 | 128 | ||
| 128 | /* | 129 | /* |
| @@ -137,173 +138,171 @@ BIO *BIO_new_file(const char *filename, const char *mode) | |||
| 137 | * ERROR_NO_UNICODE_TRANSLATION, in which case we fall | 138 | * ERROR_NO_UNICODE_TRANSLATION, in which case we fall |
| 138 | * back to fopen... | 139 | * back to fopen... |
| 139 | */ | 140 | */ |
| 140 | if ((sz=MultiByteToWideChar(CP_UTF8,(flags=MB_ERR_INVALID_CHARS), | 141 | if ((sz = MultiByteToWideChar(CP_UTF8,(flags = MB_ERR_INVALID_CHARS), |
| 141 | filename,len_0,NULL,0))>0 || | 142 | filename, len_0, NULL, 0)) > 0 || |
| 142 | (GetLastError()==ERROR_INVALID_FLAGS && | 143 | (GetLastError() == ERROR_INVALID_FLAGS && |
| 143 | (sz=MultiByteToWideChar(CP_UTF8,(flags=0), | 144 | (sz = MultiByteToWideChar(CP_UTF8,(flags = 0), |
| 144 | filename,len_0,NULL,0))>0) | 145 | filename, len_0, NULL, 0)) > 0)) { |
| 145 | ) | ||
| 146 | { | ||
| 147 | WCHAR wmode[8]; | 146 | WCHAR wmode[8]; |
| 148 | WCHAR *wfilename = _alloca(sz*sizeof(WCHAR)); | 147 | WCHAR *wfilename = _alloca(sz*sizeof(WCHAR)); |
| 149 | 148 | ||
| 150 | if (MultiByteToWideChar(CP_UTF8,flags, | 149 | if (MultiByteToWideChar(CP_UTF8, flags, filename, len_0, |
| 151 | filename,len_0,wfilename,sz) && | 150 | wfilename, sz) && MultiByteToWideChar(CP_UTF8, 0, mode, |
| 152 | MultiByteToWideChar(CP_UTF8,0,mode,strlen(mode)+1, | 151 | strlen(mode) + 1, wmode, |
| 153 | wmode,sizeof(wmode)/sizeof(wmode[0])) && | 152 | sizeof(wmode) / sizeof(wmode[0])) && |
| 154 | (file=_wfopen(wfilename,wmode))==NULL && | 153 | (file = _wfopen(wfilename, wmode)) == NULL && |
| 155 | (errno==ENOENT || errno==EBADF) | 154 | (errno == ENOENT || errno == EBADF) |
| 156 | ) /* UTF-8 decode succeeded, but no file, filename | 155 | ) /* UTF - 8 decode succeeded, but no file, filename |
| 157 | * could still have been locale-ized... */ | 156 | * could still have been locale-ized... */ |
| 158 | file = fopen(filename,mode); | 157 | file = fopen(filename, mode); |
| 159 | } | 158 | } else if (GetLastError() == ERROR_NO_UNICODE_TRANSLATION) { |
| 160 | else if (GetLastError()==ERROR_NO_UNICODE_TRANSLATION) | 159 | file = fopen(filename, mode); |
| 161 | { | 160 | } |
| 162 | file = fopen(filename,mode); | ||
| 163 | } | ||
| 164 | #else | 161 | #else |
| 165 | file=fopen(filename,mode); | 162 | file = fopen(filename, mode); |
| 163 | |||
| 166 | #endif | 164 | #endif |
| 167 | if (file == NULL) | 165 | if (file == NULL) { |
| 168 | { | ||
| 169 | SYSerr(SYS_F_FOPEN, errno); | 166 | SYSerr(SYS_F_FOPEN, errno); |
| 170 | ERR_add_error_data(5,"fopen('",filename,"','",mode,"')"); | 167 | ERR_add_error_data(5, "fopen('", filename, "', '", mode, "')"); |
| 171 | if (errno == ENOENT) | 168 | if (errno == ENOENT) |
| 172 | BIOerr(BIO_F_BIO_NEW_FILE,BIO_R_NO_SUCH_FILE); | 169 | BIOerr(BIO_F_BIO_NEW_FILE, BIO_R_NO_SUCH_FILE); |
| 173 | else | 170 | else |
| 174 | BIOerr(BIO_F_BIO_NEW_FILE,ERR_R_SYS_LIB); | 171 | BIOerr(BIO_F_BIO_NEW_FILE, ERR_R_SYS_LIB); |
| 175 | return(NULL); | 172 | return (NULL); |
| 176 | } | 173 | } |
| 177 | if ((ret=BIO_new(BIO_s_file())) == NULL) | 174 | if ((ret = BIO_new(BIO_s_file())) == NULL) { |
| 178 | { | ||
| 179 | fclose(file); | 175 | fclose(file); |
| 180 | return(NULL); | 176 | return (NULL); |
| 181 | } | ||
| 182 | |||
| 183 | BIO_clear_flags(ret,BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */ | ||
| 184 | BIO_set_fp(ret,file,BIO_CLOSE); | ||
| 185 | return(ret); | ||
| 186 | } | 177 | } |
| 187 | 178 | ||
| 188 | BIO *BIO_new_fp(FILE *stream, int close_flag) | 179 | BIO_clear_flags(ret, BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */ |
| 189 | { | 180 | BIO_set_fp(ret, file, BIO_CLOSE); |
| 190 | BIO *ret; | 181 | return (ret); |
| 191 | 182 | } | |
| 192 | if ((ret=BIO_new(BIO_s_file())) == NULL) | ||
| 193 | return(NULL); | ||
| 194 | |||
| 195 | BIO_set_flags(ret,BIO_FLAGS_UPLINK); /* redundant, left for documentation puposes */ | ||
| 196 | BIO_set_fp(ret,stream,close_flag); | ||
| 197 | return(ret); | ||
| 198 | } | ||
| 199 | 183 | ||
| 200 | BIO_METHOD *BIO_s_file(void) | 184 | BIO |
| 201 | { | 185 | *BIO_new_fp(FILE *stream, int close_flag) |
| 202 | return(&methods_filep); | 186 | { |
| 203 | } | 187 | BIO *ret; |
| 204 | 188 | ||
| 205 | static int file_new(BIO *bi) | 189 | if ((ret = BIO_new(BIO_s_file())) == NULL) |
| 206 | { | 190 | return (NULL); |
| 207 | bi->init=0; | 191 | |
| 208 | bi->num=0; | 192 | BIO_set_flags(ret, BIO_FLAGS_UPLINK); /* redundant, left for documentation puposes */ |
| 209 | bi->ptr=NULL; | 193 | BIO_set_fp(ret, stream, close_flag); |
| 194 | return (ret); | ||
| 195 | } | ||
| 196 | |||
| 197 | BIO_METHOD | ||
| 198 | *BIO_s_file(void) | ||
| 199 | { | ||
| 200 | return (&methods_filep); | ||
| 201 | } | ||
| 202 | |||
| 203 | static int | ||
| 204 | file_new(BIO *bi) | ||
| 205 | { | ||
| 206 | bi->init = 0; | ||
| 207 | bi->num = 0; | ||
| 208 | bi->ptr = NULL; | ||
| 210 | bi->flags=BIO_FLAGS_UPLINK; /* default to UPLINK */ | 209 | bi->flags=BIO_FLAGS_UPLINK; /* default to UPLINK */ |
| 211 | return(1); | 210 | return (1); |
| 212 | } | 211 | } |
| 213 | 212 | ||
| 214 | static int file_free(BIO *a) | 213 | static int |
| 215 | { | 214 | file_free(BIO *a) |
| 216 | if (a == NULL) return(0); | 215 | { |
| 217 | if (a->shutdown) | 216 | if (a == NULL) |
| 218 | { | 217 | return (0); |
| 219 | if ((a->init) && (a->ptr != NULL)) | 218 | if (a->shutdown) { |
| 220 | { | 219 | if ((a->init) && (a->ptr != NULL)) { |
| 221 | if (a->flags&BIO_FLAGS_UPLINK) | 220 | if (a->flags&BIO_FLAGS_UPLINK) |
| 222 | UP_fclose (a->ptr); | 221 | UP_fclose (a->ptr); |
| 223 | else | 222 | else |
| 224 | fclose (a->ptr); | 223 | fclose (a->ptr); |
| 225 | a->ptr=NULL; | 224 | a->ptr = NULL; |
| 226 | a->flags=BIO_FLAGS_UPLINK; | 225 | a->flags = BIO_FLAGS_UPLINK; |
| 227 | } | ||
| 228 | a->init=0; | ||
| 229 | } | 226 | } |
| 230 | return(1); | 227 | a->init = 0; |
| 231 | } | 228 | } |
| 232 | 229 | return (1); | |
| 233 | static int file_read(BIO *b, char *out, int outl) | 230 | } |
| 234 | { | ||
| 235 | int ret=0; | ||
| 236 | 231 | ||
| 237 | if (b->init && (out != NULL)) | 232 | static int |
| 238 | { | 233 | file_read(BIO *b, char *out, int outl) |
| 234 | { | ||
| 235 | int ret = 0; | ||
| 236 | |||
| 237 | if (b->init && (out != NULL)) { | ||
| 239 | if (b->flags&BIO_FLAGS_UPLINK) | 238 | if (b->flags&BIO_FLAGS_UPLINK) |
| 240 | ret=UP_fread(out,1,(int)outl,b->ptr); | 239 | ret = UP_fread(out, 1,(int)outl, b->ptr); |
| 241 | else | 240 | else |
| 242 | ret=fread(out,1,(int)outl,(FILE *)b->ptr); | 241 | ret = fread(out, 1,(int)outl,(FILE *)b->ptr); |
| 243 | if(ret == 0 && (b->flags&BIO_FLAGS_UPLINK)?UP_ferror((FILE *)b->ptr):ferror((FILE *)b->ptr)) | 242 | if (ret == 0 && (b->flags & BIO_FLAGS_UPLINK) ? |
| 244 | { | 243 | UP_ferror((FILE *)b->ptr) : ferror((FILE *)b->ptr)) { |
| 245 | SYSerr(SYS_F_FREAD, errno); | 244 | SYSerr(SYS_F_FREAD, errno); |
| 246 | BIOerr(BIO_F_FILE_READ,ERR_R_SYS_LIB); | 245 | BIOerr(BIO_F_FILE_READ, ERR_R_SYS_LIB); |
| 247 | ret=-1; | 246 | ret = -1; |
| 248 | } | ||
| 249 | } | 247 | } |
| 250 | return(ret); | ||
| 251 | } | 248 | } |
| 249 | return (ret); | ||
| 250 | } | ||
| 252 | 251 | ||
| 253 | static int file_write(BIO *b, const char *in, int inl) | 252 | static int |
| 254 | { | 253 | file_write(BIO *b, const char *in, int inl) |
| 255 | int ret=0; | 254 | { |
| 255 | int ret = 0; | ||
| 256 | 256 | ||
| 257 | if (b->init && (in != NULL)) | 257 | if (b->init && (in != NULL)) { |
| 258 | { | ||
| 259 | if (b->flags&BIO_FLAGS_UPLINK) | 258 | if (b->flags&BIO_FLAGS_UPLINK) |
| 260 | ret=UP_fwrite(in,(int)inl,1,b->ptr); | 259 | ret = UP_fwrite(in,(int)inl, 1, b->ptr); |
| 261 | else | 260 | else |
| 262 | ret=fwrite(in,(int)inl,1,(FILE *)b->ptr); | 261 | ret = fwrite(in,(int)inl, 1,(FILE *)b->ptr); |
| 263 | if (ret) | 262 | if (ret) |
| 264 | ret=inl; | 263 | ret = inl; |
| 265 | /* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */ | 264 | /* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */ |
| 266 | /* according to Tim Hudson <tjh@cryptsoft.com>, the commented | 265 | /* according to Tim Hudson <tjh@cryptsoft.com>, the commented |
| 267 | * out version above can cause 'inl' write calls under | 266 | * out version above can cause 'inl' write calls under |
| 268 | * some stupid stdio implementations (VMS) */ | 267 | * some stupid stdio implementations (VMS) */ |
| 269 | } | ||
| 270 | return(ret); | ||
| 271 | } | 268 | } |
| 272 | 269 | return (ret); | |
| 273 | static long file_ctrl(BIO *b, int cmd, long num, void *ptr) | 270 | } |
| 274 | { | 271 | |
| 275 | long ret=1; | 272 | static long |
| 276 | FILE *fp=(FILE *)b->ptr; | 273 | file_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 274 | { | ||
| 275 | long ret = 1; | ||
| 276 | FILE *fp = (FILE *)b->ptr; | ||
| 277 | FILE **fpp; | 277 | FILE **fpp; |
| 278 | char p[4]; | 278 | char p[4]; |
| 279 | 279 | ||
| 280 | switch (cmd) | 280 | switch (cmd) { |
| 281 | { | ||
| 282 | case BIO_C_FILE_SEEK: | 281 | case BIO_C_FILE_SEEK: |
| 283 | case BIO_CTRL_RESET: | 282 | case BIO_CTRL_RESET: |
| 284 | if (b->flags&BIO_FLAGS_UPLINK) | 283 | if (b->flags&BIO_FLAGS_UPLINK) |
| 285 | ret=(long)UP_fseek(b->ptr,num,0); | 284 | ret = (long)UP_fseek(b->ptr, num, 0); |
| 286 | else | 285 | else |
| 287 | ret=(long)fseek(fp,num,0); | 286 | ret = (long)fseek(fp, num, 0); |
| 288 | break; | 287 | break; |
| 289 | case BIO_CTRL_EOF: | 288 | case BIO_CTRL_EOF: |
| 290 | if (b->flags&BIO_FLAGS_UPLINK) | 289 | if (b->flags&BIO_FLAGS_UPLINK) |
| 291 | ret=(long)UP_feof(fp); | 290 | ret = (long)UP_feof(fp); |
| 292 | else | 291 | else |
| 293 | ret=(long)feof(fp); | 292 | ret = (long)feof(fp); |
| 294 | break; | 293 | break; |
| 295 | case BIO_C_FILE_TELL: | 294 | case BIO_C_FILE_TELL: |
| 296 | case BIO_CTRL_INFO: | 295 | case BIO_CTRL_INFO: |
| 297 | if (b->flags&BIO_FLAGS_UPLINK) | 296 | if (b->flags&BIO_FLAGS_UPLINK) |
| 298 | ret=UP_ftell(b->ptr); | 297 | ret = UP_ftell(b->ptr); |
| 299 | else | 298 | else |
| 300 | ret=ftell(fp); | 299 | ret = ftell(fp); |
| 301 | break; | 300 | break; |
| 302 | case BIO_C_SET_FILE_PTR: | 301 | case BIO_C_SET_FILE_PTR: |
| 303 | file_free(b); | 302 | file_free(b); |
| 304 | b->shutdown=(int)num&BIO_CLOSE; | 303 | b->shutdown = (int)num&BIO_CLOSE; |
| 305 | b->ptr=ptr; | 304 | b->ptr = ptr; |
| 306 | b->init=1; | 305 | b->init = 1; |
| 307 | #if BIO_FLAGS_UPLINK!=0 | 306 | #if BIO_FLAGS_UPLINK!=0 |
| 308 | #if defined(__MINGW32__) && defined(__MSVCRT__) && !defined(_IOB_ENTRIES) | 307 | #if defined(__MINGW32__) && defined(__MSVCRT__) && !defined(_IOB_ENTRIES) |
| 309 | #define _IOB_ENTRIES 20 | 308 | #define _IOB_ENTRIES 20 |
| @@ -311,8 +310,8 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 311 | #if defined(_IOB_ENTRIES) | 310 | #if defined(_IOB_ENTRIES) |
| 312 | /* Safety net to catch purely internal BIO_set_fp calls */ | 311 | /* Safety net to catch purely internal BIO_set_fp calls */ |
| 313 | if ((size_t)ptr >= (size_t)stdin && | 312 | if ((size_t)ptr >= (size_t)stdin && |
| 314 | (size_t)ptr < (size_t)(stdin+_IOB_ENTRIES)) | 313 | (size_t)ptr < (size_t)(stdin + _IOB_ENTRIES)) |
| 315 | BIO_clear_flags(b,BIO_FLAGS_UPLINK); | 314 | BIO_clear_flags(b, BIO_FLAGS_UPLINK); |
| 316 | #endif | 315 | #endif |
| 317 | #endif | 316 | #endif |
| 318 | #ifdef UP_fsetmod | 317 | #ifdef UP_fsetmod |
| @@ -322,102 +321,94 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 322 | #endif | 321 | #endif |
| 323 | { | 322 | { |
| 324 | #if defined(OPENSSL_SYS_WINDOWS) | 323 | #if defined(OPENSSL_SYS_WINDOWS) |
| 325 | int fd = _fileno((FILE*)ptr); | 324 | int fd = _fileno((FILE*)ptr); |
| 326 | if (num & BIO_FP_TEXT) | 325 | if (num & BIO_FP_TEXT) |
| 327 | _setmode(fd,_O_TEXT); | 326 | _setmode(fd, _O_TEXT); |
| 328 | else | 327 | else |
| 329 | _setmode(fd,_O_BINARY); | 328 | _setmode(fd, _O_BINARY); |
| 330 | #elif defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_CLIB) | 329 | #elif defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_CLIB) |
| 331 | int fd = fileno((FILE*)ptr); | 330 | int fd = fileno((FILE*)ptr); |
| 332 | /* Under CLib there are differences in file modes */ | 331 | /* Under CLib there are differences in file modes */ |
| 333 | if (num & BIO_FP_TEXT) | 332 | if (num & BIO_FP_TEXT) |
| 334 | setmode(fd,O_TEXT); | 333 | setmode(fd, O_TEXT); |
| 335 | else | ||
| 336 | setmode(fd,O_BINARY); | ||
| 337 | #elif defined(OPENSSL_SYS_MSDOS) | ||
| 338 | int fd = fileno((FILE*)ptr); | ||
| 339 | /* Set correct text/binary mode */ | ||
| 340 | if (num & BIO_FP_TEXT) | ||
| 341 | _setmode(fd,_O_TEXT); | ||
| 342 | /* Dangerous to set stdin/stdout to raw (unless redirected) */ | ||
| 343 | else | ||
| 344 | { | ||
| 345 | if (fd == STDIN_FILENO || fd == STDOUT_FILENO) | ||
| 346 | { | ||
| 347 | if (isatty(fd) <= 0) | ||
| 348 | _setmode(fd,_O_BINARY); | ||
| 349 | } | ||
| 350 | else | 334 | else |
| 351 | _setmode(fd,_O_BINARY); | 335 | setmode(fd, O_BINARY); |
| 336 | #elif defined(OPENSSL_SYS_MSDOS) | ||
| 337 | int fd = fileno((FILE*)ptr); | ||
| 338 | /* Set correct text/binary mode */ | ||
| 339 | if (num & BIO_FP_TEXT) | ||
| 340 | _setmode(fd, _O_TEXT); | ||
| 341 | /* Dangerous to set stdin/stdout to raw (unless redirected) */ | ||
| 342 | else { | ||
| 343 | if (fd == STDIN_FILENO || fd == STDOUT_FILENO) { | ||
| 344 | if (isatty(fd) <= 0) | ||
| 345 | _setmode(fd, _O_BINARY); | ||
| 346 | } else | ||
| 347 | _setmode(fd, _O_BINARY); | ||
| 352 | } | 348 | } |
| 353 | #elif defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN) | 349 | #elif defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN) |
| 354 | int fd = fileno((FILE*)ptr); | 350 | int fd = fileno((FILE*)ptr); |
| 355 | if (num & BIO_FP_TEXT) | 351 | if (num & BIO_FP_TEXT) |
| 356 | setmode(fd, O_TEXT); | 352 | setmode(fd, O_TEXT); |
| 357 | else | 353 | else |
| 358 | setmode(fd, O_BINARY); | 354 | setmode(fd, O_BINARY); |
| 359 | #endif | 355 | #endif |
| 360 | } | 356 | } |
| 361 | break; | 357 | break; |
| 362 | case BIO_C_SET_FILENAME: | 358 | case BIO_C_SET_FILENAME: |
| 363 | file_free(b); | 359 | file_free(b); |
| 364 | b->shutdown=(int)num&BIO_CLOSE; | 360 | b->shutdown = (int)num&BIO_CLOSE; |
| 365 | if (num & BIO_FP_APPEND) | 361 | if (num & BIO_FP_APPEND) { |
| 366 | { | ||
| 367 | if (num & BIO_FP_READ) | 362 | if (num & BIO_FP_READ) |
| 368 | BUF_strlcpy(p,"a+",sizeof p); | 363 | BUF_strlcpy(p, "a+", sizeof p); |
| 369 | else BUF_strlcpy(p,"a",sizeof p); | 364 | else BUF_strlcpy(p, "a", sizeof p); |
| 370 | } | 365 | } else if ((num & BIO_FP_READ) && (num & BIO_FP_WRITE)) |
| 371 | else if ((num & BIO_FP_READ) && (num & BIO_FP_WRITE)) | 366 | BUF_strlcpy(p, "r+", sizeof p); |
| 372 | BUF_strlcpy(p,"r+",sizeof p); | ||
| 373 | else if (num & BIO_FP_WRITE) | 367 | else if (num & BIO_FP_WRITE) |
| 374 | BUF_strlcpy(p,"w",sizeof p); | 368 | BUF_strlcpy(p, "w", sizeof p); |
| 375 | else if (num & BIO_FP_READ) | 369 | else if (num & BIO_FP_READ) |
| 376 | BUF_strlcpy(p,"r",sizeof p); | 370 | BUF_strlcpy(p, "r", sizeof p); |
| 377 | else | 371 | else { |
| 378 | { | 372 | BIOerr(BIO_F_FILE_CTRL, BIO_R_BAD_FOPEN_MODE); |
| 379 | BIOerr(BIO_F_FILE_CTRL,BIO_R_BAD_FOPEN_MODE); | 373 | ret = 0; |
| 380 | ret=0; | ||
| 381 | break; | 374 | break; |
| 382 | } | 375 | } |
| 383 | #if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN) | 376 | #if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN) |
| 384 | if (!(num & BIO_FP_TEXT)) | 377 | if (!(num & BIO_FP_TEXT)) |
| 385 | strcat(p,"b"); | 378 | strcat(p, "b"); |
| 386 | else | 379 | else |
| 387 | strcat(p,"t"); | 380 | strcat(p, "t"); |
| 388 | #endif | 381 | #endif |
| 389 | #if defined(OPENSSL_SYS_NETWARE) | 382 | #if defined(OPENSSL_SYS_NETWARE) |
| 390 | if (!(num & BIO_FP_TEXT)) | 383 | if (!(num & BIO_FP_TEXT)) |
| 391 | strcat(p,"b"); | 384 | strcat(p, "b"); |
| 392 | else | 385 | else |
| 393 | strcat(p,"t"); | 386 | strcat(p, "t"); |
| 394 | #endif | 387 | #endif |
| 395 | fp=fopen(ptr,p); | 388 | fp = fopen(ptr, p); |
| 396 | if (fp == NULL) | 389 | if (fp == NULL) { |
| 397 | { | ||
| 398 | SYSerr(SYS_F_FOPEN, errno); | 390 | SYSerr(SYS_F_FOPEN, errno); |
| 399 | ERR_add_error_data(5,"fopen('",ptr,"','",p,"')"); | 391 | ERR_add_error_data(5, "fopen('", ptr, "', '", p, "')"); |
| 400 | BIOerr(BIO_F_FILE_CTRL,ERR_R_SYS_LIB); | 392 | BIOerr(BIO_F_FILE_CTRL, ERR_R_SYS_LIB); |
| 401 | ret=0; | 393 | ret = 0; |
| 402 | break; | 394 | break; |
| 403 | } | 395 | } |
| 404 | b->ptr=fp; | 396 | b->ptr = fp; |
| 405 | b->init=1; | 397 | b->init = 1; |
| 406 | BIO_clear_flags(b,BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */ | 398 | BIO_clear_flags(b, BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */ |
| 407 | break; | 399 | break; |
| 408 | case BIO_C_GET_FILE_PTR: | 400 | case BIO_C_GET_FILE_PTR: |
| 409 | /* the ptr parameter is actually a FILE ** in this case. */ | 401 | /* the ptr parameter is actually a FILE ** in this case. */ |
| 410 | if (ptr != NULL) | 402 | if (ptr != NULL) { |
| 411 | { | 403 | fpp = (FILE **)ptr; |
| 412 | fpp=(FILE **)ptr; | 404 | *fpp = (FILE *)b->ptr; |
| 413 | *fpp=(FILE *)b->ptr; | 405 | } |
| 414 | } | ||
| 415 | break; | 406 | break; |
| 416 | case BIO_CTRL_GET_CLOSE: | 407 | case BIO_CTRL_GET_CLOSE: |
| 417 | ret=(long)b->shutdown; | 408 | ret = (long)b->shutdown; |
| 418 | break; | 409 | break; |
| 419 | case BIO_CTRL_SET_CLOSE: | 410 | case BIO_CTRL_SET_CLOSE: |
| 420 | b->shutdown=(int)num; | 411 | b->shutdown = (int)num; |
| 421 | break; | 412 | break; |
| 422 | case BIO_CTRL_FLUSH: | 413 | case BIO_CTRL_FLUSH: |
| 423 | if (b->flags&BIO_FLAGS_UPLINK) | 414 | if (b->flags&BIO_FLAGS_UPLINK) |
| @@ -426,7 +417,7 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 426 | fflush((FILE *)b->ptr); | 417 | fflush((FILE *)b->ptr); |
| 427 | break; | 418 | break; |
| 428 | case BIO_CTRL_DUP: | 419 | case BIO_CTRL_DUP: |
| 429 | ret=1; | 420 | ret = 1; |
| 430 | break; | 421 | break; |
| 431 | 422 | ||
| 432 | case BIO_CTRL_WPENDING: | 423 | case BIO_CTRL_WPENDING: |
| @@ -434,44 +425,41 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 434 | case BIO_CTRL_PUSH: | 425 | case BIO_CTRL_PUSH: |
| 435 | case BIO_CTRL_POP: | 426 | case BIO_CTRL_POP: |
| 436 | default: | 427 | default: |
| 437 | ret=0; | 428 | ret = 0; |
| 438 | break; | 429 | break; |
| 439 | } | ||
| 440 | return(ret); | ||
| 441 | } | 430 | } |
| 431 | return (ret); | ||
| 432 | } | ||
| 442 | 433 | ||
| 443 | static int file_gets(BIO *bp, char *buf, int size) | 434 | static int |
| 444 | { | 435 | file_gets(BIO *bp, char *buf, int size) |
| 445 | int ret=0; | 436 | { |
| 437 | int ret = 0; | ||
| 446 | 438 | ||
| 447 | buf[0]='\0'; | 439 | buf[0] = '\0'; |
| 448 | if (bp->flags&BIO_FLAGS_UPLINK) | 440 | if (bp->flags&BIO_FLAGS_UPLINK) { |
| 449 | { | 441 | if (!UP_fgets(buf, size, bp->ptr)) |
| 450 | if (!UP_fgets(buf,size,bp->ptr)) | ||
| 451 | goto err; | 442 | goto err; |
| 452 | } | 443 | } else { |
| 453 | else | 444 | if (!fgets(buf, size,(FILE *)bp->ptr)) |
| 454 | { | ||
| 455 | if (!fgets(buf,size,(FILE *)bp->ptr)) | ||
| 456 | goto err; | 445 | goto err; |
| 457 | } | ||
| 458 | if (buf[0] != '\0') | ||
| 459 | ret=strlen(buf); | ||
| 460 | err: | ||
| 461 | return(ret); | ||
| 462 | } | 446 | } |
| 447 | if (buf[0] != '\0') | ||
| 448 | ret = strlen(buf); | ||
| 449 | err: | ||
| 450 | return (ret); | ||
| 451 | } | ||
| 463 | 452 | ||
| 464 | static int file_puts(BIO *bp, const char *str) | 453 | static int |
| 465 | { | 454 | file_puts(BIO *bp, const char *str) |
| 466 | int n,ret; | 455 | { |
| 456 | int n, ret; | ||
| 467 | 457 | ||
| 468 | n=strlen(str); | 458 | n = strlen(str); |
| 469 | ret=file_write(bp,str,n); | 459 | ret = file_write(bp, str, n); |
| 470 | return(ret); | 460 | return (ret); |
| 471 | } | 461 | } |
| 472 | 462 | ||
| 473 | #endif /* OPENSSL_NO_STDIO */ | 463 | #endif /* OPENSSL_NO_STDIO */ |
| 474 | 464 | ||
| 475 | #endif /* HEADER_BSS_FILE_C */ | 465 | #endif /* HEADER_BSS_FILE_C */ |
| 476 | |||
| 477 | |||
diff --git a/src/lib/libssl/src/crypto/bio/bss_log.c b/src/lib/libssl/src/crypto/bio/bss_log.c index 1cc413a916..9225af4df2 100644 --- a/src/lib/libssl/src/crypto/bio/bss_log.c +++ b/src/lib/libssl/src/crypto/bio/bss_log.c | |||
| @@ -80,7 +80,7 @@ | |||
| 80 | # if __INITIAL_POINTER_SIZE == 64 | 80 | # if __INITIAL_POINTER_SIZE == 64 |
| 81 | # pragma pointer_size save | 81 | # pragma pointer_size save |
| 82 | # pragma pointer_size 32 | 82 | # pragma pointer_size 32 |
| 83 | void * _malloc32 (__size_t); | 83 | void * _malloc32 (__size_t); |
| 84 | # pragma pointer_size restore | 84 | # pragma pointer_size restore |
| 85 | # endif /* __INITIAL_POINTER_SIZE == 64 */ | 85 | # endif /* __INITIAL_POINTER_SIZE == 64 */ |
| 86 | # endif /* __INITIAL_POINTER_SIZE && defined _ANSI_C_SOURCE */ | 86 | # endif /* __INITIAL_POINTER_SIZE && defined _ANSI_C_SOURCE */ |
| @@ -131,9 +131,8 @@ static void xopenlog(BIO* bp, char* name, int level); | |||
| 131 | static void xsyslog(BIO* bp, int priority, const char* string); | 131 | static void xsyslog(BIO* bp, int priority, const char* string); |
| 132 | static void xcloselog(BIO* bp); | 132 | static void xcloselog(BIO* bp); |
| 133 | 133 | ||
| 134 | static BIO_METHOD methods_slg= | 134 | static BIO_METHOD methods_slg = { |
| 135 | { | 135 | BIO_TYPE_MEM, "syslog", |
| 136 | BIO_TYPE_MEM,"syslog", | ||
| 137 | slg_write, | 136 | slg_write, |
| 138 | NULL, | 137 | NULL, |
| 139 | slg_puts, | 138 | slg_puts, |
| @@ -142,43 +141,46 @@ static BIO_METHOD methods_slg= | |||
| 142 | slg_new, | 141 | slg_new, |
| 143 | slg_free, | 142 | slg_free, |
| 144 | NULL, | 143 | NULL, |
| 145 | }; | 144 | }; |
| 146 | 145 | ||
| 147 | BIO_METHOD *BIO_s_log(void) | 146 | BIO_METHOD |
| 148 | { | 147 | *BIO_s_log(void) |
| 149 | return(&methods_slg); | 148 | { |
| 150 | } | 149 | return (&methods_slg); |
| 150 | } | ||
| 151 | 151 | ||
| 152 | static int slg_new(BIO *bi) | 152 | static int |
| 153 | { | 153 | slg_new(BIO *bi) |
| 154 | bi->init=1; | 154 | { |
| 155 | bi->num=0; | 155 | bi->init = 1; |
| 156 | bi->ptr=NULL; | 156 | bi->num = 0; |
| 157 | bi->ptr = NULL; | ||
| 157 | xopenlog(bi, "application", LOG_DAEMON); | 158 | xopenlog(bi, "application", LOG_DAEMON); |
| 158 | return(1); | 159 | return (1); |
| 159 | } | 160 | } |
| 160 | 161 | ||
| 161 | static int slg_free(BIO *a) | 162 | static int |
| 162 | { | 163 | slg_free(BIO *a) |
| 163 | if (a == NULL) return(0); | 164 | { |
| 165 | if (a == NULL) | ||
| 166 | return (0); | ||
| 164 | xcloselog(a); | 167 | xcloselog(a); |
| 165 | return(1); | 168 | return (1); |
| 166 | } | 169 | } |
| 167 | 170 | ||
| 168 | static int slg_write(BIO *b, const char *in, int inl) | 171 | static int |
| 169 | { | 172 | slg_write(BIO *b, const char *in, int inl) |
| 170 | int ret= inl; | 173 | { |
| 174 | int ret = inl; | ||
| 171 | char* buf; | 175 | char* buf; |
| 172 | char* pp; | 176 | char* pp; |
| 173 | int priority, i; | 177 | int priority, i; |
| 174 | static const struct | 178 | static const struct { |
| 175 | { | ||
| 176 | int strl; | 179 | int strl; |
| 177 | char str[10]; | 180 | char str[10]; |
| 178 | int log_level; | 181 | int log_level; |
| 179 | } | 182 | } |
| 180 | mapping[] = | 183 | mapping[] = { |
| 181 | { | ||
| 182 | { 6, "PANIC ", LOG_EMERG }, | 184 | { 6, "PANIC ", LOG_EMERG }, |
| 183 | { 6, "EMERG ", LOG_EMERG }, | 185 | { 6, "EMERG ", LOG_EMERG }, |
| 184 | { 4, "EMR ", LOG_EMERG }, | 186 | { 4, "EMR ", LOG_EMERG }, |
| @@ -199,69 +201,72 @@ static int slg_write(BIO *b, const char *in, int inl) | |||
| 199 | { 6, "DEBUG ", LOG_DEBUG }, | 201 | { 6, "DEBUG ", LOG_DEBUG }, |
| 200 | { 4, "DBG ", LOG_DEBUG }, | 202 | { 4, "DBG ", LOG_DEBUG }, |
| 201 | { 0, "", LOG_ERR } /* The default */ | 203 | { 0, "", LOG_ERR } /* The default */ |
| 202 | }; | 204 | }; |
| 203 | 205 | ||
| 204 | if((buf= (char *)OPENSSL_malloc(inl+ 1)) == NULL){ | 206 | if ((buf = (char *)OPENSSL_malloc(inl + 1)) == NULL) { |
| 205 | return(0); | 207 | return (0); |
| 206 | } | 208 | } |
| 207 | strncpy(buf, in, inl); | 209 | strncpy(buf, in, inl); |
| 208 | buf[inl]= '\0'; | 210 | buf[inl] = '\0'; |
| 209 | 211 | ||
| 210 | i = 0; | 212 | i = 0; |
| 211 | while(strncmp(buf, mapping[i].str, mapping[i].strl) != 0) i++; | 213 | while (strncmp(buf, mapping[i].str, mapping[i].strl) != 0) |
| 214 | i++; | ||
| 212 | priority = mapping[i].log_level; | 215 | priority = mapping[i].log_level; |
| 213 | pp = buf + mapping[i].strl; | 216 | pp = buf + mapping[i].strl; |
| 214 | 217 | ||
| 215 | xsyslog(b, priority, pp); | 218 | xsyslog(b, priority, pp); |
| 216 | 219 | ||
| 217 | OPENSSL_free(buf); | 220 | OPENSSL_free(buf); |
| 218 | return(ret); | 221 | return (ret); |
| 219 | } | 222 | } |
| 220 | 223 | ||
| 221 | static long slg_ctrl(BIO *b, int cmd, long num, void *ptr) | 224 | static long |
| 222 | { | 225 | slg_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 223 | switch (cmd) | 226 | { |
| 224 | { | 227 | switch (cmd) { |
| 225 | case BIO_CTRL_SET: | 228 | case BIO_CTRL_SET: |
| 226 | xcloselog(b); | 229 | xcloselog(b); |
| 227 | xopenlog(b, ptr, num); | 230 | xopenlog(b, ptr, num); |
| 228 | break; | 231 | break; |
| 229 | default: | 232 | default: |
| 230 | break; | 233 | break; |
| 231 | } | ||
| 232 | return(0); | ||
| 233 | } | 234 | } |
| 235 | return (0); | ||
| 236 | } | ||
| 234 | 237 | ||
| 235 | static int slg_puts(BIO *bp, const char *str) | 238 | static int |
| 236 | { | 239 | slg_puts(BIO *bp, const char *str) |
| 237 | int n,ret; | 240 | { |
| 241 | int n, ret; | ||
| 238 | 242 | ||
| 239 | n=strlen(str); | 243 | n = strlen(str); |
| 240 | ret=slg_write(bp,str,n); | 244 | ret = slg_write(bp, str, n); |
| 241 | return(ret); | 245 | return (ret); |
| 242 | } | 246 | } |
| 243 | 247 | ||
| 244 | #if defined(OPENSSL_SYS_WIN32) | 248 | #if defined(OPENSSL_SYS_WIN32) |
| 245 | 249 | ||
| 246 | static void xopenlog(BIO* bp, char* name, int level) | 250 | static void |
| 251 | xopenlog(BIO* bp, char* name, int level) | ||
| 247 | { | 252 | { |
| 248 | if (check_winnt()) | 253 | if (check_winnt()) |
| 249 | bp->ptr = RegisterEventSourceA(NULL,name); | 254 | bp->ptr = RegisterEventSourceA(NULL, name); |
| 250 | else | 255 | else |
| 251 | bp->ptr = NULL; | 256 | bp->ptr = NULL; |
| 252 | } | 257 | } |
| 253 | 258 | ||
| 254 | static void xsyslog(BIO *bp, int priority, const char *string) | 259 | static void |
| 260 | xsyslog(BIO *bp, int priority, const char *string) | ||
| 255 | { | 261 | { |
| 256 | LPCSTR lpszStrings[2]; | 262 | LPCSTR lpszStrings[2]; |
| 257 | WORD evtype= EVENTLOG_ERROR_TYPE; | 263 | WORD evtype = EVENTLOG_ERROR_TYPE; |
| 258 | char pidbuf[DECIMAL_SIZE(DWORD)+4]; | 264 | char pidbuf[DECIMAL_SIZE(DWORD) + 4]; |
| 259 | 265 | ||
| 260 | if (bp->ptr == NULL) | 266 | if (bp->ptr == NULL) |
| 261 | return; | 267 | return; |
| 262 | 268 | ||
| 263 | switch (priority) | 269 | switch (priority) { |
| 264 | { | ||
| 265 | case LOG_EMERG: | 270 | case LOG_EMERG: |
| 266 | case LOG_ALERT: | 271 | case LOG_ALERT: |
| 267 | case LOG_CRIT: | 272 | case LOG_CRIT: |
| @@ -280,33 +285,37 @@ static void xsyslog(BIO *bp, int priority, const char *string) | |||
| 280 | as error anyway. */ | 285 | as error anyway. */ |
| 281 | evtype = EVENTLOG_ERROR_TYPE; | 286 | evtype = EVENTLOG_ERROR_TYPE; |
| 282 | break; | 287 | break; |
| 283 | } | 288 | } |
| 284 | 289 | ||
| 285 | sprintf(pidbuf, "[%u] ", GetCurrentProcessId()); | 290 | sprintf(pidbuf, "[%u] ", GetCurrentProcessId()); |
| 286 | lpszStrings[0] = pidbuf; | 291 | lpszStrings[0] = pidbuf; |
| 287 | lpszStrings[1] = string; | 292 | lpszStrings[1] = string; |
| 288 | 293 | ||
| 289 | ReportEventA(bp->ptr, evtype, 0, 1024, NULL, 2, 0, | 294 | ReportEventA(bp->ptr, evtype, 0, 1024, NULL, 2, 0, |
| 290 | lpszStrings, NULL); | 295 | lpszStrings, NULL); |
| 291 | } | 296 | } |
| 292 | 297 | ||
| 293 | static void xcloselog(BIO* bp) | 298 | static void |
| 299 | xcloselog(BIO* bp) | ||
| 294 | { | 300 | { |
| 295 | if(bp->ptr) | 301 | if (bp->ptr) |
| 296 | DeregisterEventSource((HANDLE)(bp->ptr)); | 302 | DeregisterEventSource((HANDLE)(bp->ptr)); |
| 297 | bp->ptr= NULL; | 303 | bp->ptr = NULL; |
| 298 | } | 304 | } |
| 299 | 305 | ||
| 300 | #elif defined(OPENSSL_SYS_VMS) | 306 | #elif defined(OPENSSL_SYS_VMS) |
| 301 | 307 | ||
| 302 | static int VMS_OPC_target = LOG_DAEMON; | 308 | static int VMS_OPC_target = LOG_DAEMON; |
| 303 | 309 | ||
| 304 | static void xopenlog(BIO* bp, char* name, int level) | 310 | static void |
| 311 | xopenlog(BIO* bp, char* name, int level) | ||
| 305 | { | 312 | { |
| 306 | VMS_OPC_target = level; | 313 | VMS_OPC_target = level; |
| 314 | |||
| 307 | } | 315 | } |
| 308 | 316 | ||
| 309 | static void xsyslog(BIO *bp, int priority, const char *string) | 317 | static void |
| 318 | xsyslog(BIO *bp, int priority, const char *string) | ||
| 310 | { | 319 | { |
| 311 | struct dsc$descriptor_s opc_dsc; | 320 | struct dsc$descriptor_s opc_dsc; |
| 312 | 321 | ||
| @@ -329,21 +338,28 @@ static void xsyslog(BIO *bp, int priority, const char *string) | |||
| 329 | 338 | ||
| 330 | char buf[10240]; | 339 | char buf[10240]; |
| 331 | unsigned int len; | 340 | unsigned int len; |
| 332 | struct dsc$descriptor_s buf_dsc; | 341 | struct dsc$descriptor_s buf_dsc; |
| 333 | $DESCRIPTOR(fao_cmd, "!AZ: !AZ"); | 342 | $DESCRIPTOR(fao_cmd, "!AZ: !AZ"); |
| 334 | char *priority_tag; | 343 | char *priority_tag; |
| 335 | 344 | ||
| 336 | switch (priority) | 345 | switch (priority) { |
| 337 | { | 346 | case LOG_EMERG: |
| 338 | case LOG_EMERG: priority_tag = "Emergency"; break; | 347 | priority_tag = "Emergency"; break; |
| 339 | case LOG_ALERT: priority_tag = "Alert"; break; | 348 | case LOG_ALERT: |
| 340 | case LOG_CRIT: priority_tag = "Critical"; break; | 349 | priority_tag = "Alert"; break; |
| 341 | case LOG_ERR: priority_tag = "Error"; break; | 350 | case LOG_CRIT: |
| 342 | case LOG_WARNING: priority_tag = "Warning"; break; | 351 | priority_tag = "Critical"; break; |
| 343 | case LOG_NOTICE: priority_tag = "Notice"; break; | 352 | case LOG_ERR: |
| 344 | case LOG_INFO: priority_tag = "Info"; break; | 353 | priority_tag = "Error"; break; |
| 345 | case LOG_DEBUG: priority_tag = "DEBUG"; break; | 354 | case LOG_WARNING: |
| 346 | } | 355 | priority_tag = "Warning"; break; |
| 356 | case LOG_NOTICE: | ||
| 357 | priority_tag = "Notice"; break; | ||
| 358 | case LOG_INFO: | ||
| 359 | priority_tag = "Info"; break; | ||
| 360 | case LOG_DEBUG: | ||
| 361 | priority_tag = "DEBUG"; break; | ||
| 362 | } | ||
| 347 | 363 | ||
| 348 | buf_dsc.dsc$b_dtype = DSC$K_DTYPE_T; | 364 | buf_dsc.dsc$b_dtype = DSC$K_DTYPE_T; |
| 349 | buf_dsc.dsc$b_class = DSC$K_CLASS_S; | 365 | buf_dsc.dsc$b_class = DSC$K_CLASS_S; |
| @@ -353,7 +369,7 @@ static void xsyslog(BIO *bp, int priority, const char *string) | |||
| 353 | lib$sys_fao(&fao_cmd, &len, &buf_dsc, priority_tag, string); | 369 | lib$sys_fao(&fao_cmd, &len, &buf_dsc, priority_tag, string); |
| 354 | 370 | ||
| 355 | /* We know there's an 8-byte header. That's documented. */ | 371 | /* We know there's an 8-byte header. That's documented. */ |
| 356 | opcdef_p = OPCDEF_MALLOC( 8+ len); | 372 | opcdef_p = OPCDEF_MALLOC( 8 + len); |
| 357 | opcdef_p->opc$b_ms_type = OPC$_RQ_RQST; | 373 | opcdef_p->opc$b_ms_type = OPC$_RQ_RQST; |
| 358 | memcpy(opcdef_p->opc$z_ms_target_classes, &VMS_OPC_target, 3); | 374 | memcpy(opcdef_p->opc$z_ms_target_classes, &VMS_OPC_target, 3); |
| 359 | opcdef_p->opc$l_ms_rqstid = 0; | 375 | opcdef_p->opc$l_ms_rqstid = 0; |
| @@ -369,13 +385,15 @@ static void xsyslog(BIO *bp, int priority, const char *string) | |||
| 369 | OPENSSL_free(opcdef_p); | 385 | OPENSSL_free(opcdef_p); |
| 370 | } | 386 | } |
| 371 | 387 | ||
| 372 | static void xcloselog(BIO* bp) | 388 | static void |
| 389 | xcloselog(BIO* bp) | ||
| 373 | { | 390 | { |
| 374 | } | 391 | } |
| 375 | 392 | ||
| 376 | #else /* Unix/Watt32 */ | 393 | #else /* Unix/Watt32 */ |
| 377 | 394 | ||
| 378 | static void xopenlog(BIO* bp, char* name, int level) | 395 | static void |
| 396 | xopenlog(BIO* bp, char* name, int level) | ||
| 379 | { | 397 | { |
| 380 | #ifdef WATT32 /* djgpp/DOS */ | 398 | #ifdef WATT32 /* djgpp/DOS */ |
| 381 | openlog(name, LOG_PID|LOG_CONS|LOG_NDELAY, level); | 399 | openlog(name, LOG_PID|LOG_CONS|LOG_NDELAY, level); |
| @@ -384,12 +402,14 @@ static void xopenlog(BIO* bp, char* name, int level) | |||
| 384 | #endif | 402 | #endif |
| 385 | } | 403 | } |
| 386 | 404 | ||
| 387 | static void xsyslog(BIO *bp, int priority, const char *string) | 405 | static void |
| 406 | xsyslog(BIO *bp, int priority, const char *string) | ||
| 388 | { | 407 | { |
| 389 | syslog(priority, "%s", string); | 408 | syslog(priority, "%s", string); |
| 390 | } | 409 | } |
| 391 | 410 | ||
| 392 | static void xcloselog(BIO* bp) | 411 | static void |
| 412 | xcloselog(BIO* bp) | ||
| 393 | { | 413 | { |
| 394 | closelog(); | 414 | closelog(); |
| 395 | } | 415 | } |
diff --git a/src/lib/libssl/src/crypto/bio/bss_mem.c b/src/lib/libssl/src/crypto/bio/bss_mem.c index 37d4194e4b..a5192202bd 100644 --- a/src/lib/libssl/src/crypto/bio/bss_mem.c +++ b/src/lib/libssl/src/crypto/bio/bss_mem.c | |||
| @@ -68,8 +68,8 @@ static int mem_gets(BIO *h, char *str, int size); | |||
| 68 | static long mem_ctrl(BIO *h, int cmd, long arg1, void *arg2); | 68 | static long mem_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 69 | static int mem_new(BIO *h); | 69 | static int mem_new(BIO *h); |
| 70 | static int mem_free(BIO *data); | 70 | static int mem_free(BIO *data); |
| 71 | static BIO_METHOD mem_method= | 71 | |
| 72 | { | 72 | static BIO_METHOD mem_method = { |
| 73 | BIO_TYPE_MEM, | 73 | BIO_TYPE_MEM, |
| 74 | "memory buffer", | 74 | "memory buffer", |
| 75 | mem_write, | 75 | mem_write, |
| @@ -80,28 +80,31 @@ static BIO_METHOD mem_method= | |||
| 80 | mem_new, | 80 | mem_new, |
| 81 | mem_free, | 81 | mem_free, |
| 82 | NULL, | 82 | NULL, |
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | /* bio->num is used to hold the value to return on 'empty', if it is | 85 | /* bio->num is used to hold the value to return on 'empty', if it is |
| 86 | * 0, should_retry is not set */ | 86 | * 0, should_retry is not set */ |
| 87 | 87 | ||
| 88 | BIO_METHOD *BIO_s_mem(void) | 88 | BIO_METHOD |
| 89 | { | 89 | *BIO_s_mem(void) |
| 90 | return(&mem_method); | 90 | { |
| 91 | } | 91 | return (&mem_method); |
| 92 | } | ||
| 92 | 93 | ||
| 93 | BIO *BIO_new_mem_buf(void *buf, int len) | 94 | BIO |
| 95 | *BIO_new_mem_buf(void *buf, int len) | ||
| 94 | { | 96 | { |
| 95 | BIO *ret; | 97 | BIO *ret; |
| 96 | BUF_MEM *b; | 98 | BUF_MEM *b; |
| 97 | size_t sz; | 99 | size_t sz; |
| 98 | 100 | ||
| 99 | if (!buf) { | 101 | if (!buf) { |
| 100 | BIOerr(BIO_F_BIO_NEW_MEM_BUF,BIO_R_NULL_PARAMETER); | 102 | BIOerr(BIO_F_BIO_NEW_MEM_BUF, BIO_R_NULL_PARAMETER); |
| 101 | return NULL; | 103 | return NULL; |
| 102 | } | 104 | } |
| 103 | sz = (len<0) ? strlen(buf) : (size_t)len; | 105 | sz = (len < 0) ? strlen(buf) : (size_t)len; |
| 104 | if(!(ret = BIO_new(BIO_s_mem())) ) return NULL; | 106 | if (!(ret = BIO_new(BIO_s_mem()))) |
| 107 | return NULL; | ||
| 105 | b = (BUF_MEM *)ret->ptr; | 108 | b = (BUF_MEM *)ret->ptr; |
| 106 | b->data = buf; | 109 | b->data = buf; |
| 107 | b->length = sz; | 110 | b->length = sz; |
| @@ -112,208 +115,205 @@ BIO *BIO_new_mem_buf(void *buf, int len) | |||
| 112 | return ret; | 115 | return ret; |
| 113 | } | 116 | } |
| 114 | 117 | ||
| 115 | static int mem_new(BIO *bi) | 118 | static int |
| 116 | { | 119 | mem_new(BIO *bi) |
| 120 | { | ||
| 117 | BUF_MEM *b; | 121 | BUF_MEM *b; |
| 118 | 122 | ||
| 119 | if ((b=BUF_MEM_new()) == NULL) | 123 | if ((b = BUF_MEM_new()) == NULL) |
| 120 | return(0); | 124 | return (0); |
| 121 | bi->shutdown=1; | 125 | bi->shutdown = 1; |
| 122 | bi->init=1; | 126 | bi->init = 1; |
| 123 | bi->num= -1; | 127 | bi->num = -1; |
| 124 | bi->ptr=(char *)b; | 128 | bi->ptr = (char *)b; |
| 125 | return(1); | 129 | return (1); |
| 126 | } | 130 | } |
| 127 | 131 | ||
| 128 | static int mem_free(BIO *a) | 132 | static int |
| 129 | { | 133 | mem_free(BIO *a) |
| 130 | if (a == NULL) return(0); | 134 | { |
| 131 | if (a->shutdown) | 135 | if (a == NULL) |
| 132 | { | 136 | return (0); |
| 133 | if ((a->init) && (a->ptr != NULL)) | 137 | if (a->shutdown) { |
| 134 | { | 138 | if ((a->init) && (a->ptr != NULL)) { |
| 135 | BUF_MEM *b; | 139 | BUF_MEM *b; |
| 136 | b = (BUF_MEM *)a->ptr; | 140 | b = (BUF_MEM *)a->ptr; |
| 137 | if(a->flags & BIO_FLAGS_MEM_RDONLY) b->data = NULL; | 141 | if (a->flags & BIO_FLAGS_MEM_RDONLY) |
| 138 | BUF_MEM_free(b); | 142 | b->data = NULL; |
| 139 | a->ptr=NULL; | 143 | BUF_MEM_free(b); |
| 140 | } | 144 | a->ptr = NULL; |
| 141 | } | 145 | } |
| 142 | return(1); | ||
| 143 | } | 146 | } |
| 144 | 147 | return (1); | |
| 145 | static int mem_read(BIO *b, char *out, int outl) | 148 | } |
| 146 | { | 149 | |
| 147 | int ret= -1; | 150 | static int |
| 151 | mem_read(BIO *b, char *out, int outl) | ||
| 152 | { | ||
| 153 | int ret = -1; | ||
| 148 | BUF_MEM *bm; | 154 | BUF_MEM *bm; |
| 149 | 155 | ||
| 150 | bm=(BUF_MEM *)b->ptr; | 156 | bm = (BUF_MEM *)b->ptr; |
| 151 | BIO_clear_retry_flags(b); | 157 | BIO_clear_retry_flags(b); |
| 152 | ret=(outl >=0 && (size_t)outl > bm->length)?(int)bm->length:outl; | 158 | ret = (outl >=0 && (size_t)outl > bm->length) ? (int)bm->length : outl; |
| 153 | if ((out != NULL) && (ret > 0)) { | 159 | if ((out != NULL) && (ret > 0)) { |
| 154 | memcpy(out,bm->data,ret); | 160 | memcpy(out, bm->data, ret); |
| 155 | bm->length-=ret; | 161 | bm->length -= ret; |
| 156 | if(b->flags & BIO_FLAGS_MEM_RDONLY) bm->data += ret; | 162 | if (b->flags & BIO_FLAGS_MEM_RDONLY) |
| 163 | bm->data += ret; | ||
| 157 | else { | 164 | else { |
| 158 | memmove(&(bm->data[0]),&(bm->data[ret]),bm->length); | 165 | memmove(&(bm->data[0]), &(bm->data[ret]), bm->length); |
| 159 | } | 166 | } |
| 160 | } else if (bm->length == 0) | 167 | } else if (bm->length == 0) { |
| 161 | { | ||
| 162 | ret = b->num; | 168 | ret = b->num; |
| 163 | if (ret != 0) | 169 | if (ret != 0) |
| 164 | BIO_set_retry_read(b); | 170 | BIO_set_retry_read(b); |
| 165 | } | ||
| 166 | return(ret); | ||
| 167 | } | 171 | } |
| 172 | return (ret); | ||
| 173 | } | ||
| 168 | 174 | ||
| 169 | static int mem_write(BIO *b, const char *in, int inl) | 175 | static int |
| 170 | { | 176 | mem_write(BIO *b, const char *in, int inl) |
| 171 | int ret= -1; | 177 | { |
| 178 | int ret = -1; | ||
| 172 | int blen; | 179 | int blen; |
| 173 | BUF_MEM *bm; | 180 | BUF_MEM *bm; |
| 174 | 181 | ||
| 175 | bm=(BUF_MEM *)b->ptr; | 182 | bm = (BUF_MEM *)b->ptr; |
| 176 | if (in == NULL) | 183 | if (in == NULL) { |
| 177 | { | 184 | BIOerr(BIO_F_MEM_WRITE, BIO_R_NULL_PARAMETER); |
| 178 | BIOerr(BIO_F_MEM_WRITE,BIO_R_NULL_PARAMETER); | ||
| 179 | goto end; | 185 | goto end; |
| 180 | } | 186 | } |
| 181 | 187 | ||
| 182 | if(b->flags & BIO_FLAGS_MEM_RDONLY) { | 188 | if (b->flags & BIO_FLAGS_MEM_RDONLY) { |
| 183 | BIOerr(BIO_F_MEM_WRITE,BIO_R_WRITE_TO_READ_ONLY_BIO); | 189 | BIOerr(BIO_F_MEM_WRITE, BIO_R_WRITE_TO_READ_ONLY_BIO); |
| 184 | goto end; | 190 | goto end; |
| 185 | } | 191 | } |
| 186 | 192 | ||
| 187 | BIO_clear_retry_flags(b); | 193 | BIO_clear_retry_flags(b); |
| 188 | blen=bm->length; | 194 | blen = bm->length; |
| 189 | if (BUF_MEM_grow_clean(bm,blen+inl) != (blen+inl)) | 195 | if (BUF_MEM_grow_clean(bm, blen + inl) != (blen + inl)) |
| 190 | goto end; | 196 | goto end; |
| 191 | memcpy(&(bm->data[blen]),in,inl); | 197 | memcpy(&(bm->data[blen]), in, inl); |
| 192 | ret=inl; | 198 | ret = inl; |
| 193 | end: | 199 | end: |
| 194 | return(ret); | 200 | return (ret); |
| 195 | } | 201 | } |
| 196 | 202 | ||
| 197 | static long mem_ctrl(BIO *b, int cmd, long num, void *ptr) | 203 | static long |
| 198 | { | 204 | mem_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 199 | long ret=1; | 205 | { |
| 206 | long ret = 1; | ||
| 200 | char **pptr; | 207 | char **pptr; |
| 201 | 208 | ||
| 202 | BUF_MEM *bm=(BUF_MEM *)b->ptr; | 209 | BUF_MEM *bm = (BUF_MEM *)b->ptr; |
| 203 | 210 | ||
| 204 | switch (cmd) | 211 | switch (cmd) { |
| 205 | { | ||
| 206 | case BIO_CTRL_RESET: | 212 | case BIO_CTRL_RESET: |
| 207 | if (bm->data != NULL) | 213 | if (bm->data != NULL) { |
| 208 | { | ||
| 209 | /* For read only case reset to the start again */ | 214 | /* For read only case reset to the start again */ |
| 210 | if(b->flags & BIO_FLAGS_MEM_RDONLY) | 215 | if (b->flags & BIO_FLAGS_MEM_RDONLY) { |
| 211 | { | ||
| 212 | bm->data -= bm->max - bm->length; | 216 | bm->data -= bm->max - bm->length; |
| 213 | bm->length = bm->max; | 217 | bm->length = bm->max; |
| 214 | } | 218 | } else { |
| 215 | else | 219 | memset(bm->data, 0, bm->max); |
| 216 | { | 220 | bm->length = 0; |
| 217 | memset(bm->data,0,bm->max); | ||
| 218 | bm->length=0; | ||
| 219 | } | ||
| 220 | } | 221 | } |
| 222 | } | ||
| 221 | break; | 223 | break; |
| 222 | case BIO_CTRL_EOF: | 224 | case BIO_CTRL_EOF: |
| 223 | ret=(long)(bm->length == 0); | 225 | ret = (long)(bm->length == 0); |
| 224 | break; | 226 | break; |
| 225 | case BIO_C_SET_BUF_MEM_EOF_RETURN: | 227 | case BIO_C_SET_BUF_MEM_EOF_RETURN: |
| 226 | b->num=(int)num; | 228 | b->num = (int)num; |
| 227 | break; | 229 | break; |
| 228 | case BIO_CTRL_INFO: | 230 | case BIO_CTRL_INFO: |
| 229 | ret=(long)bm->length; | 231 | ret = (long)bm->length; |
| 230 | if (ptr != NULL) | 232 | if (ptr != NULL) { |
| 231 | { | 233 | pptr = (char **)ptr; |
| 232 | pptr=(char **)ptr; | 234 | *pptr = (char *)&(bm->data[0]); |
| 233 | *pptr=(char *)&(bm->data[0]); | 235 | } |
| 234 | } | ||
| 235 | break; | 236 | break; |
| 236 | case BIO_C_SET_BUF_MEM: | 237 | case BIO_C_SET_BUF_MEM: |
| 237 | mem_free(b); | 238 | mem_free(b); |
| 238 | b->shutdown=(int)num; | 239 | b->shutdown = (int)num; |
| 239 | b->ptr=ptr; | 240 | b->ptr = ptr; |
| 240 | break; | 241 | break; |
| 241 | case BIO_C_GET_BUF_MEM_PTR: | 242 | case BIO_C_GET_BUF_MEM_PTR: |
| 242 | if (ptr != NULL) | 243 | if (ptr != NULL) { |
| 243 | { | 244 | pptr = (char **)ptr; |
| 244 | pptr=(char **)ptr; | 245 | *pptr = (char *)bm; |
| 245 | *pptr=(char *)bm; | 246 | } |
| 246 | } | ||
| 247 | break; | 247 | break; |
| 248 | case BIO_CTRL_GET_CLOSE: | 248 | case BIO_CTRL_GET_CLOSE: |
| 249 | ret=(long)b->shutdown; | 249 | ret = (long)b->shutdown; |
| 250 | break; | 250 | break; |
| 251 | case BIO_CTRL_SET_CLOSE: | 251 | case BIO_CTRL_SET_CLOSE: |
| 252 | b->shutdown=(int)num; | 252 | b->shutdown = (int)num; |
| 253 | break; | 253 | break; |
| 254 | 254 | ||
| 255 | case BIO_CTRL_WPENDING: | 255 | case BIO_CTRL_WPENDING: |
| 256 | ret=0L; | 256 | ret = 0L; |
| 257 | break; | 257 | break; |
| 258 | case BIO_CTRL_PENDING: | 258 | case BIO_CTRL_PENDING: |
| 259 | ret=(long)bm->length; | 259 | ret = (long)bm->length; |
| 260 | break; | 260 | break; |
| 261 | case BIO_CTRL_DUP: | 261 | case BIO_CTRL_DUP: |
| 262 | case BIO_CTRL_FLUSH: | 262 | case BIO_CTRL_FLUSH: |
| 263 | ret=1; | 263 | ret = 1; |
| 264 | break; | 264 | break; |
| 265 | case BIO_CTRL_PUSH: | 265 | case BIO_CTRL_PUSH: |
| 266 | case BIO_CTRL_POP: | 266 | case BIO_CTRL_POP: |
| 267 | default: | 267 | default: |
| 268 | ret=0; | 268 | ret = 0; |
| 269 | break; | 269 | break; |
| 270 | } | ||
| 271 | return(ret); | ||
| 272 | } | 270 | } |
| 271 | return (ret); | ||
| 272 | } | ||
| 273 | 273 | ||
| 274 | static int mem_gets(BIO *bp, char *buf, int size) | 274 | static int |
| 275 | { | 275 | mem_gets(BIO *bp, char *buf, int size) |
| 276 | int i,j; | 276 | { |
| 277 | int ret= -1; | 277 | int i, j; |
| 278 | int ret = -1; | ||
| 278 | char *p; | 279 | char *p; |
| 279 | BUF_MEM *bm=(BUF_MEM *)bp->ptr; | 280 | BUF_MEM *bm = (BUF_MEM *)bp->ptr; |
| 280 | 281 | ||
| 281 | BIO_clear_retry_flags(bp); | 282 | BIO_clear_retry_flags(bp); |
| 282 | j=bm->length; | 283 | j = bm->length; |
| 283 | if ((size-1) < j) j=size-1; | 284 | if ((size - 1) < j) |
| 284 | if (j <= 0) | 285 | j = size - 1; |
| 285 | { | 286 | if (j <= 0) { |
| 286 | *buf='\0'; | 287 | *buf = '\0'; |
| 287 | return 0; | 288 | return 0; |
| 288 | } | 289 | } |
| 289 | p=bm->data; | 290 | p = bm->data; |
| 290 | for (i=0; i<j; i++) | 291 | for (i = 0; i < j; i++) { |
| 291 | { | 292 | if (p[i] == '\n') { |
| 292 | if (p[i] == '\n') | ||
| 293 | { | ||
| 294 | i++; | 293 | i++; |
| 295 | break; | 294 | break; |
| 296 | } | ||
| 297 | } | 295 | } |
| 296 | } | ||
| 298 | 297 | ||
| 299 | /* | 298 | /* |
| 300 | * i is now the max num of bytes to copy, either j or up to | 299 | * i is now the max num of bytes to copy, either j or up to |
| 301 | * and including the first newline | 300 | * and including the first newline |
| 302 | */ | 301 | */ |
| 303 | 302 | ||
| 304 | i=mem_read(bp,buf,i); | 303 | i = mem_read(bp, buf, i); |
| 305 | if (i > 0) buf[i]='\0'; | 304 | if (i > 0) |
| 306 | ret=i; | 305 | buf[i] = '\0'; |
| 307 | return(ret); | 306 | ret = i; |
| 308 | } | 307 | return (ret); |
| 308 | } | ||
| 309 | 309 | ||
| 310 | static int mem_puts(BIO *bp, const char *str) | 310 | static int |
| 311 | { | 311 | mem_puts(BIO *bp, const char *str) |
| 312 | int n,ret; | 312 | { |
| 313 | int n, ret; | ||
| 313 | 314 | ||
| 314 | n=strlen(str); | 315 | n = strlen(str); |
| 315 | ret=mem_write(bp,str,n); | 316 | ret = mem_write(bp, str, n); |
| 316 | /* memory semantics is that it will always work */ | 317 | /* memory semantics is that it will always work */ |
| 317 | return(ret); | 318 | return (ret); |
| 318 | } | 319 | } |
| 319 | |||
diff --git a/src/lib/libssl/src/crypto/bio/bss_null.c b/src/lib/libssl/src/crypto/bio/bss_null.c index 46b73339df..51aed2ac4b 100644 --- a/src/lib/libssl/src/crypto/bio/bss_null.c +++ b/src/lib/libssl/src/crypto/bio/bss_null.c | |||
| @@ -68,8 +68,8 @@ static int null_gets(BIO *h, char *str, int size); | |||
| 68 | static long null_ctrl(BIO *h, int cmd, long arg1, void *arg2); | 68 | static long null_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 69 | static int null_new(BIO *h); | 69 | static int null_new(BIO *h); |
| 70 | static int null_free(BIO *data); | 70 | static int null_free(BIO *data); |
| 71 | static BIO_METHOD null_method= | 71 | |
| 72 | { | 72 | static BIO_METHOD null_method = { |
| 73 | BIO_TYPE_NULL, | 73 | BIO_TYPE_NULL, |
| 74 | "NULL", | 74 | "NULL", |
| 75 | null_write, | 75 | null_write, |
| @@ -80,50 +80,56 @@ static BIO_METHOD null_method= | |||
| 80 | null_new, | 80 | null_new, |
| 81 | null_free, | 81 | null_free, |
| 82 | NULL, | 82 | NULL, |
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | BIO_METHOD *BIO_s_null(void) | 85 | BIO_METHOD |
| 86 | { | 86 | *BIO_s_null(void) |
| 87 | return(&null_method); | 87 | { |
| 88 | } | 88 | return (&null_method); |
| 89 | } | ||
| 89 | 90 | ||
| 90 | static int null_new(BIO *bi) | 91 | static int |
| 91 | { | 92 | null_new(BIO *bi) |
| 92 | bi->init=1; | 93 | { |
| 93 | bi->num=0; | 94 | bi->init = 1; |
| 94 | bi->ptr=(NULL); | 95 | bi->num = 0; |
| 95 | return(1); | 96 | bi->ptr = (NULL); |
| 96 | } | 97 | return (1); |
| 98 | } | ||
| 97 | 99 | ||
| 98 | static int null_free(BIO *a) | 100 | static int |
| 99 | { | 101 | null_free(BIO *a) |
| 100 | if (a == NULL) return(0); | 102 | { |
| 101 | return(1); | 103 | if (a == NULL) |
| 102 | } | 104 | return (0); |
| 103 | 105 | return (1); | |
| 104 | static int null_read(BIO *b, char *out, int outl) | 106 | } |
| 105 | { | ||
| 106 | return(0); | ||
| 107 | } | ||
| 108 | 107 | ||
| 109 | static int null_write(BIO *b, const char *in, int inl) | 108 | static int |
| 110 | { | 109 | null_read(BIO *b, char *out, int outl) |
| 111 | return(inl); | 110 | { |
| 112 | } | 111 | return (0); |
| 112 | } | ||
| 113 | |||
| 114 | static int | ||
| 115 | null_write(BIO *b, const char *in, int inl) | ||
| 116 | { | ||
| 117 | return (inl); | ||
| 118 | } | ||
| 113 | 119 | ||
| 114 | static long null_ctrl(BIO *b, int cmd, long num, void *ptr) | 120 | static long |
| 115 | { | 121 | null_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 116 | long ret=1; | 122 | { |
| 123 | long ret = 1; | ||
| 117 | 124 | ||
| 118 | switch (cmd) | 125 | switch (cmd) { |
| 119 | { | ||
| 120 | case BIO_CTRL_RESET: | 126 | case BIO_CTRL_RESET: |
| 121 | case BIO_CTRL_EOF: | 127 | case BIO_CTRL_EOF: |
| 122 | case BIO_CTRL_SET: | 128 | case BIO_CTRL_SET: |
| 123 | case BIO_CTRL_SET_CLOSE: | 129 | case BIO_CTRL_SET_CLOSE: |
| 124 | case BIO_CTRL_FLUSH: | 130 | case BIO_CTRL_FLUSH: |
| 125 | case BIO_CTRL_DUP: | 131 | case BIO_CTRL_DUP: |
| 126 | ret=1; | 132 | ret = 1; |
| 127 | break; | 133 | break; |
| 128 | case BIO_CTRL_GET_CLOSE: | 134 | case BIO_CTRL_GET_CLOSE: |
| 129 | case BIO_CTRL_INFO: | 135 | case BIO_CTRL_INFO: |
| @@ -131,20 +137,22 @@ static long null_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 131 | case BIO_CTRL_PENDING: | 137 | case BIO_CTRL_PENDING: |
| 132 | case BIO_CTRL_WPENDING: | 138 | case BIO_CTRL_WPENDING: |
| 133 | default: | 139 | default: |
| 134 | ret=0; | 140 | ret = 0; |
| 135 | break; | 141 | break; |
| 136 | } | ||
| 137 | return(ret); | ||
| 138 | } | 142 | } |
| 143 | return (ret); | ||
| 144 | } | ||
| 139 | 145 | ||
| 140 | static int null_gets(BIO *bp, char *buf, int size) | 146 | static int |
| 141 | { | 147 | null_gets(BIO *bp, char *buf, int size) |
| 142 | return(0); | 148 | { |
| 143 | } | 149 | return (0); |
| 144 | 150 | } | |
| 145 | static int null_puts(BIO *bp, const char *str) | ||
| 146 | { | ||
| 147 | if (str == NULL) return(0); | ||
| 148 | return(strlen(str)); | ||
| 149 | } | ||
| 150 | 151 | ||
| 152 | static int | ||
| 153 | null_puts(BIO *bp, const char *str) | ||
| 154 | { | ||
| 155 | if (str == NULL) | ||
| 156 | return (0); | ||
| 157 | return (strlen(str)); | ||
| 158 | } | ||
diff --git a/src/lib/libssl/src/crypto/bio/bss_rtcp.c b/src/lib/libssl/src/crypto/bio/bss_rtcp.c index 7dae485564..84d01e58b4 100644 --- a/src/lib/libssl/src/crypto/bio/bss_rtcp.c +++ b/src/lib/libssl/src/crypto/bio/bss_rtcp.c | |||
| @@ -73,31 +73,32 @@ | |||
| 73 | 73 | ||
| 74 | typedef unsigned short io_channel; | 74 | typedef unsigned short io_channel; |
| 75 | /*************************************************************************/ | 75 | /*************************************************************************/ |
| 76 | struct io_status { short status, count; long flags; }; | 76 | struct io_status { short status, count; |
| 77 | long flags; | ||
| 78 | }; | ||
| 77 | 79 | ||
| 78 | struct rpc_msg { /* Should have member alignment inhibited */ | 80 | struct rpc_msg { /* Should have member alignment inhibited */ |
| 79 | char channel; /* 'A'-app data. 'R'-remote client 'G'-global */ | 81 | char channel; /* 'A'-app data. 'R'-remote client 'G'-global */ |
| 80 | char function; /* 'G'-get, 'P'-put, 'C'-confirm, 'X'-close */ | 82 | char function; /* 'G'-get, 'P'-put, 'C'-confirm, 'X'-close */ |
| 81 | unsigned short int length; /* Amount of data returned or max to return */ | 83 | unsigned short int length; /* Amount of data returned or max to return */ |
| 82 | char data[4092]; /* variable data */ | 84 | char data[4092]; /* variable data */ |
| 83 | }; | 85 | }; |
| 84 | #define RPC_HDR_SIZE (sizeof(struct rpc_msg) - 4092) | 86 | #define RPC_HDR_SIZE (sizeof(struct rpc_msg) - 4092) |
| 85 | 87 | ||
| 86 | struct rpc_ctx { | 88 | struct rpc_ctx { |
| 87 | int filled, pos; | 89 | int filled, pos; |
| 88 | struct rpc_msg msg; | 90 | struct rpc_msg msg; |
| 89 | }; | 91 | }; |
| 90 | 92 | ||
| 91 | static int rtcp_write(BIO *h,const char *buf,int num); | 93 | static int rtcp_write(BIO *h, const char *buf, int num); |
| 92 | static int rtcp_read(BIO *h,char *buf,int size); | 94 | static int rtcp_read(BIO *h, char *buf, int size); |
| 93 | static int rtcp_puts(BIO *h,const char *str); | 95 | static int rtcp_puts(BIO *h, const char *str); |
| 94 | static int rtcp_gets(BIO *h,char *str,int size); | 96 | static int rtcp_gets(BIO *h, char *str, int size); |
| 95 | static long rtcp_ctrl(BIO *h,int cmd,long arg1,void *arg2); | 97 | static long rtcp_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 96 | static int rtcp_new(BIO *h); | 98 | static int rtcp_new(BIO *h); |
| 97 | static int rtcp_free(BIO *data); | 99 | static int rtcp_free(BIO *data); |
| 98 | 100 | ||
| 99 | static BIO_METHOD rtcp_method= | 101 | static BIO_METHOD rtcp_method = { |
| 100 | { | ||
| 101 | BIO_TYPE_FD, | 102 | BIO_TYPE_FD, |
| 102 | "RTCP", | 103 | "RTCP", |
| 103 | rtcp_write, | 104 | rtcp_write, |
| @@ -108,12 +109,13 @@ static BIO_METHOD rtcp_method= | |||
| 108 | rtcp_new, | 109 | rtcp_new, |
| 109 | rtcp_free, | 110 | rtcp_free, |
| 110 | NULL, | 111 | NULL, |
| 111 | }; | 112 | }; |
| 112 | 113 | ||
| 113 | BIO_METHOD *BIO_s_rtcp(void) | 114 | BIO_METHOD |
| 114 | { | 115 | *BIO_s_rtcp(void) |
| 115 | return(&rtcp_method); | 116 | { |
| 116 | } | 117 | return (&rtcp_method); |
| 118 | } | ||
| 117 | /*****************************************************************************/ | 119 | /*****************************************************************************/ |
| 118 | /* Decnet I/O routines. | 120 | /* Decnet I/O routines. |
| 119 | */ | 121 | */ |
| @@ -123,25 +125,28 @@ BIO_METHOD *BIO_s_rtcp(void) | |||
| 123 | #pragma message disable DOLLARID | 125 | #pragma message disable DOLLARID |
| 124 | #endif | 126 | #endif |
| 125 | 127 | ||
| 126 | static int get ( io_channel chan, char *buffer, int maxlen, int *length ) | 128 | static int get(io_channel chan, char *buffer, int maxlen, int *length) |
| 127 | { | 129 | { |
| 128 | int status; | 130 | int status; |
| 129 | struct io_status iosb; | 131 | struct io_status iosb; |
| 130 | status = sys$qiow ( 0, chan, IO$_READVBLK, &iosb, 0, 0, | 132 | status = sys$qiow(0, chan, IO$_READVBLK, &iosb, 0, 0, buffer, maxlen, |
| 131 | buffer, maxlen, 0, 0, 0, 0 ); | 133 | 0, 0, 0, 0 ); |
| 132 | if ( (status&1) == 1 ) status = iosb.status; | 134 | if ((status & 1) == 1) |
| 133 | if ( (status&1) == 1 ) *length = iosb.count; | 135 | status = iosb.status; |
| 134 | return status; | 136 | if ((status & 1) == 1 ) |
| 137 | *length = iosb.count; | ||
| 138 | return status; | ||
| 135 | } | 139 | } |
| 136 | 140 | ||
| 137 | static int put ( io_channel chan, char *buffer, int length ) | 141 | static int put(io_channel chan, char *buffer, int length) |
| 138 | { | 142 | { |
| 139 | int status; | 143 | int status; |
| 140 | struct io_status iosb; | 144 | struct io_status iosb; |
| 141 | status = sys$qiow ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0, | 145 | status = sys$qiow ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0, buffer, |
| 142 | buffer, length, 0, 0, 0, 0 ); | 146 | length, 0, 0, 0, 0 ); |
| 143 | if ( (status&1) == 1 ) status = iosb.status; | 147 | if ((status & 1) == 1) |
| 144 | return status; | 148 | status = iosb.status; |
| 149 | return status; | ||
| 145 | } | 150 | } |
| 146 | 151 | ||
| 147 | #ifdef __DECC | 152 | #ifdef __DECC |
| @@ -150,109 +155,127 @@ static int put ( io_channel chan, char *buffer, int length ) | |||
| 150 | 155 | ||
| 151 | /***************************************************************************/ | 156 | /***************************************************************************/ |
| 152 | 157 | ||
| 153 | static int rtcp_new(BIO *bi) | 158 | static int |
| 159 | rtcp_new(BIO *bi) | ||
| 154 | { | 160 | { |
| 155 | struct rpc_ctx *ctx; | 161 | struct rpc_ctx *ctx; |
| 156 | bi->init=1; | 162 | bi->init = 1; |
| 157 | bi->num=0; | 163 | bi->num = 0; |
| 158 | bi->flags = 0; | 164 | bi->flags = 0; |
| 159 | bi->ptr=OPENSSL_malloc(sizeof(struct rpc_ctx)); | 165 | bi->ptr = OPENSSL_malloc(sizeof(struct rpc_ctx)); |
| 160 | ctx = (struct rpc_ctx *) bi->ptr; | 166 | ctx = (struct rpc_ctx *)bi->ptr; |
| 161 | ctx->filled = 0; | 167 | ctx->filled = 0; |
| 162 | ctx->pos = 0; | 168 | ctx->pos = 0; |
| 163 | return(1); | 169 | return (1); |
| 164 | } | 170 | } |
| 165 | 171 | ||
| 166 | static int rtcp_free(BIO *a) | 172 | static int |
| 173 | rtcp_free(BIO *a) | ||
| 167 | { | 174 | { |
| 168 | if (a == NULL) return(0); | 175 | if (a == NULL) |
| 169 | if ( a->ptr ) OPENSSL_free ( a->ptr ); | 176 | return (0); |
| 177 | if (a->ptr) | ||
| 178 | OPENSSL_free(a->ptr); | ||
| 170 | a->ptr = NULL; | 179 | a->ptr = NULL; |
| 171 | return(1); | 180 | return (1); |
| 172 | } | 181 | } |
| 173 | 182 | ||
| 174 | static int rtcp_read(BIO *b, char *out, int outl) | 183 | static int |
| 184 | rtcp_read(BIO *b, char *out, int outl) | ||
| 175 | { | 185 | { |
| 176 | int status, length; | 186 | int status, length; |
| 177 | struct rpc_ctx *ctx; | 187 | struct rpc_ctx *ctx; |
| 178 | /* | 188 | /* |
| 179 | * read data, return existing. | 189 | * read data, return existing. |
| 180 | */ | 190 | */ |
| 181 | ctx = (struct rpc_ctx *) b->ptr; | 191 | ctx = (struct rpc_ctx *)b->ptr; |
| 182 | if ( ctx->pos < ctx->filled ) { | 192 | if (ctx->pos < ctx->filled) { |
| 183 | length = ctx->filled - ctx->pos; | 193 | length = ctx->filled - ctx->pos; |
| 184 | if ( length > outl ) length = outl; | 194 | if (length > outl) |
| 185 | memmove ( out, &ctx->msg.data[ctx->pos], length ); | 195 | length = outl; |
| 186 | ctx->pos += length; | 196 | memmove(out, &ctx->msg.data[ctx->pos], length); |
| 187 | return length; | 197 | ctx->pos += length; |
| 188 | } | 198 | return length; |
| 189 | /* | 199 | } |
| 190 | * Requst more data from R channel. | 200 | /* |
| 191 | */ | 201 | * Requst more data from R channel. |
| 192 | ctx->msg.channel = 'R'; | 202 | */ |
| 193 | ctx->msg.function = 'G'; | 203 | ctx->msg.channel = 'R'; |
| 194 | ctx->msg.length = sizeof(ctx->msg.data); | 204 | ctx->msg.function = 'G'; |
| 195 | status = put ( b->num, (char *) &ctx->msg, RPC_HDR_SIZE ); | 205 | ctx->msg.length = sizeof(ctx->msg.data); |
| 196 | if ( (status&1) == 0 ) { | 206 | status = put(b->num, (char *)&ctx->msg, RPC_HDR_SIZE); |
| 197 | return -1; | 207 | if ((status & 1) == 0 ) { |
| 198 | } | 208 | return -1; |
| 199 | /* | 209 | } |
| 200 | * Read. | 210 | /* |
| 201 | */ | 211 | * Read. |
| 202 | ctx->pos = ctx->filled = 0; | 212 | */ |
| 203 | status = get ( b->num, (char *) &ctx->msg, sizeof(ctx->msg), &length ); | 213 | ctx->pos = ctx->filled = 0; |
| 204 | if ( (status&1) == 0 ) length = -1; | 214 | status = get(b->num, (char *)&ctx->msg, sizeof(ctx->msg), &length); |
| 205 | if ( ctx->msg.channel != 'R' || ctx->msg.function != 'C' ) { | 215 | if ((status & 1) == 0) |
| 206 | length = -1; | 216 | length = -1; |
| 207 | } | 217 | if (ctx->msg.channel != 'R' || ctx->msg.function != 'C') { |
| 208 | ctx->filled = length - RPC_HDR_SIZE; | 218 | length = -1; |
| 209 | 219 | } | |
| 210 | if ( ctx->pos < ctx->filled ) { | 220 | ctx->filled = length - RPC_HDR_SIZE; |
| 211 | length = ctx->filled - ctx->pos; | 221 | |
| 212 | if ( length > outl ) length = outl; | 222 | if (ctx->pos < ctx->filled) { |
| 213 | memmove ( out, ctx->msg.data, length ); | 223 | length = ctx->filled - ctx->pos; |
| 214 | ctx->pos += length; | 224 | if (length > outl) |
| 215 | return length; | 225 | length = outl; |
| 216 | } | 226 | memmove(out, ctx->msg.data, length); |
| 227 | ctx->pos += length; | ||
| 228 | return length; | ||
| 229 | } | ||
| 217 | 230 | ||
| 218 | return length; | 231 | return length; |
| 219 | } | 232 | } |
| 220 | 233 | ||
| 221 | static int rtcp_write(BIO *b, const char *in, int inl) | 234 | static int |
| 235 | rtcp_write(BIO *b, const char *in, int inl) | ||
| 222 | { | 236 | { |
| 223 | int status, i, segment, length; | 237 | int status, i, segment, length; |
| 224 | struct rpc_ctx *ctx; | 238 | struct rpc_ctx *ctx; |
| 225 | /* | 239 | /* |
| 226 | * Output data, send in chunks no larger that sizeof(ctx->msg.data). | 240 | * Output data, send in chunks no larger that sizeof(ctx->msg.data). |
| 227 | */ | 241 | */ |
| 228 | ctx = (struct rpc_ctx *) b->ptr; | 242 | ctx = (struct rpc_ctx *)b->ptr; |
| 229 | for ( i = 0; i < inl; i += segment ) { | 243 | for (i = 0; i < inl; i += segment) { |
| 230 | segment = inl - i; | 244 | segment = inl - i; |
| 231 | if ( segment > sizeof(ctx->msg.data) ) segment = sizeof(ctx->msg.data); | 245 | if (segment > sizeof(ctx->msg.data)) |
| 232 | ctx->msg.channel = 'R'; | 246 | segment = sizeof(ctx->msg.data); |
| 233 | ctx->msg.function = 'P'; | 247 | ctx->msg.channel = 'R'; |
| 234 | ctx->msg.length = segment; | 248 | ctx->msg.function = 'P'; |
| 235 | memmove ( ctx->msg.data, &in[i], segment ); | 249 | ctx->msg.length = segment; |
| 236 | status = put ( b->num, (char *) &ctx->msg, segment + RPC_HDR_SIZE ); | 250 | memmove(ctx->msg.data, &in[i], segment); |
| 237 | if ((status&1) == 0 ) { i = -1; break; } | 251 | status = put(b->num, (char *) &ctx->msg, |
| 252 | segment + RPC_HDR_SIZE); | ||
| 253 | if ((status & 1) == 0) { | ||
| 254 | i = -1; | ||
| 255 | break; | ||
| 256 | } | ||
| 238 | 257 | ||
| 239 | status = get ( b->num, (char *) &ctx->msg, sizeof(ctx->msg), &length ); | 258 | status = get(b->num, (char *)&ctx->msg, sizeof(ctx->msg), |
| 240 | if ( ((status&1) == 0) || (length < RPC_HDR_SIZE) ) { i = -1; break; } | 259 | &length ); |
| 241 | if ( (ctx->msg.channel != 'R') || (ctx->msg.function != 'C') ) { | 260 | if (((status&1) == 0) || (length < RPC_HDR_SIZE)) { |
| 242 | printf("unexpected response when confirming put %c %c\n", | 261 | i = -1; |
| 243 | ctx->msg.channel, ctx->msg.function ); | 262 | break; |
| 263 | } | ||
| 264 | if ((ctx->msg.channel != 'R') || (ctx->msg.function != 'C')) { | ||
| 265 | printf("unexpected response when confirming put %c %c\n", | ||
| 266 | ctx->msg.channel, ctx->msg.function ); | ||
| 244 | 267 | ||
| 268 | } | ||
| 245 | } | 269 | } |
| 246 | } | 270 | return (i); |
| 247 | return(i); | ||
| 248 | } | 271 | } |
| 249 | 272 | ||
| 250 | static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) | 273 | static long |
| 251 | { | 274 | rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 252 | long ret=1; | 275 | { |
| 276 | long ret = 1; | ||
| 253 | 277 | ||
| 254 | switch (cmd) | 278 | switch (cmd) { |
| 255 | { | ||
| 256 | case BIO_CTRL_RESET: | 279 | case BIO_CTRL_RESET: |
| 257 | case BIO_CTRL_EOF: | 280 | case BIO_CTRL_EOF: |
| 258 | ret = 1; | 281 | ret = 1; |
| @@ -260,11 +283,11 @@ static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 260 | case BIO_C_SET_FD: | 283 | case BIO_C_SET_FD: |
| 261 | b->num = num; | 284 | b->num = num; |
| 262 | ret = 1; | 285 | ret = 1; |
| 263 | break; | 286 | break; |
| 264 | case BIO_CTRL_SET_CLOSE: | 287 | case BIO_CTRL_SET_CLOSE: |
| 265 | case BIO_CTRL_FLUSH: | 288 | case BIO_CTRL_FLUSH: |
| 266 | case BIO_CTRL_DUP: | 289 | case BIO_CTRL_DUP: |
| 267 | ret=1; | 290 | ret = 1; |
| 268 | break; | 291 | break; |
| 269 | case BIO_CTRL_GET_CLOSE: | 292 | case BIO_CTRL_GET_CLOSE: |
| 270 | case BIO_CTRL_INFO: | 293 | case BIO_CTRL_INFO: |
| @@ -272,23 +295,26 @@ static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 272 | case BIO_CTRL_PENDING: | 295 | case BIO_CTRL_PENDING: |
| 273 | case BIO_CTRL_WPENDING: | 296 | case BIO_CTRL_WPENDING: |
| 274 | default: | 297 | default: |
| 275 | ret=0; | 298 | ret = 0; |
| 276 | break; | 299 | break; |
| 277 | } | ||
| 278 | return(ret); | ||
| 279 | } | ||
| 280 | |||
| 281 | static int rtcp_gets(BIO *bp, char *buf, int size) | ||
| 282 | { | ||
| 283 | return(0); | ||
| 284 | } | 300 | } |
| 301 | return (ret); | ||
| 302 | } | ||
| 285 | 303 | ||
| 286 | static int rtcp_puts(BIO *bp, const char *str) | 304 | static int |
| 305 | rtcp_gets(BIO *bp, char *buf, int size) | ||
| 287 | { | 306 | { |
| 288 | int length; | 307 | return (0); |
| 289 | if (str == NULL) return(0); | ||
| 290 | length = strlen ( str ); | ||
| 291 | if ( length == 0 ) return (0); | ||
| 292 | return rtcp_write ( bp,str, length ); | ||
| 293 | } | 308 | } |
| 294 | 309 | ||
| 310 | static int | ||
| 311 | rtcp_puts(BIO *bp, const char *str) | ||
| 312 | { | ||
| 313 | int length; | ||
| 314 | if (str == NULL) | ||
| 315 | return (0); | ||
| 316 | length = strlen(str); | ||
| 317 | if (length == 0) | ||
| 318 | return (0); | ||
| 319 | return rtcp_write(bp, str, length); | ||
| 320 | } | ||
diff --git a/src/lib/libssl/src/crypto/bio/bss_sock.c b/src/lib/libssl/src/crypto/bio/bss_sock.c index eb2965970c..f6d3bf7365 100644 --- a/src/lib/libssl/src/crypto/bio/bss_sock.c +++ b/src/lib/libssl/src/crypto/bio/bss_sock.c | |||
| @@ -79,8 +79,7 @@ static int sock_new(BIO *h); | |||
| 79 | static int sock_free(BIO *data); | 79 | static int sock_free(BIO *data); |
| 80 | int BIO_sock_should_retry(int s); | 80 | int BIO_sock_should_retry(int s); |
| 81 | 81 | ||
| 82 | static BIO_METHOD methods_sockp= | 82 | static BIO_METHOD methods_sockp = { |
| 83 | { | ||
| 84 | BIO_TYPE_SOCKET, | 83 | BIO_TYPE_SOCKET, |
| 85 | "socket", | 84 | "socket", |
| 86 | sock_write, | 85 | sock_write, |
| @@ -91,152 +90,155 @@ static BIO_METHOD methods_sockp= | |||
| 91 | sock_new, | 90 | sock_new, |
| 92 | sock_free, | 91 | sock_free, |
| 93 | NULL, | 92 | NULL, |
| 94 | }; | 93 | }; |
| 95 | 94 | ||
| 96 | BIO_METHOD *BIO_s_socket(void) | 95 | BIO_METHOD |
| 97 | { | 96 | *BIO_s_socket(void) |
| 98 | return(&methods_sockp); | 97 | { |
| 99 | } | 98 | return (&methods_sockp); |
| 99 | } | ||
| 100 | 100 | ||
| 101 | BIO *BIO_new_socket(int fd, int close_flag) | 101 | BIO |
| 102 | { | 102 | *BIO_new_socket(int fd, int close_flag) |
| 103 | { | ||
| 103 | BIO *ret; | 104 | BIO *ret; |
| 104 | 105 | ||
| 105 | ret=BIO_new(BIO_s_socket()); | 106 | ret = BIO_new(BIO_s_socket()); |
| 106 | if (ret == NULL) return(NULL); | 107 | if (ret == NULL) |
| 107 | BIO_set_fd(ret,fd,close_flag); | 108 | return (NULL); |
| 108 | return(ret); | 109 | BIO_set_fd(ret, fd, close_flag); |
| 109 | } | 110 | return (ret); |
| 111 | } | ||
| 110 | 112 | ||
| 111 | static int sock_new(BIO *bi) | 113 | static int |
| 112 | { | 114 | sock_new(BIO *bi) |
| 113 | bi->init=0; | 115 | { |
| 114 | bi->num=0; | 116 | bi->init = 0; |
| 115 | bi->ptr=NULL; | 117 | bi->num = 0; |
| 116 | bi->flags=0; | 118 | bi->ptr = NULL; |
| 117 | return(1); | 119 | bi->flags = 0; |
| 118 | } | 120 | return (1); |
| 121 | } | ||
| 119 | 122 | ||
| 120 | static int sock_free(BIO *a) | 123 | static int |
| 121 | { | 124 | sock_free(BIO *a) |
| 122 | if (a == NULL) return(0); | 125 | { |
| 123 | if (a->shutdown) | 126 | if (a == NULL) |
| 124 | { | 127 | return (0); |
| 125 | if (a->init) | 128 | if (a->shutdown) { |
| 126 | { | 129 | if (a->init) { |
| 127 | shutdown(a->num, SHUT_RDWR); | 130 | shutdown(a->num, SHUT_RDWR); |
| 128 | close(a->num); | 131 | close(a->num); |
| 129 | } | ||
| 130 | a->init=0; | ||
| 131 | a->flags=0; | ||
| 132 | } | 132 | } |
| 133 | return(1); | 133 | a->init = 0; |
| 134 | a->flags = 0; | ||
| 134 | } | 135 | } |
| 135 | 136 | return (1); | |
| 136 | static int sock_read(BIO *b, char *out, int outl) | 137 | } |
| 137 | { | ||
| 138 | int ret=0; | ||
| 139 | 138 | ||
| 140 | if (out != NULL) | 139 | static int |
| 141 | { | 140 | sock_read(BIO *b, char *out, int outl) |
| 141 | { | ||
| 142 | int ret = 0; | ||
| 143 | |||
| 144 | if (out != NULL) { | ||
| 142 | errno = 0; | 145 | errno = 0; |
| 143 | ret=read(b->num,out,outl); | 146 | ret = read(b->num, out, outl); |
| 144 | BIO_clear_retry_flags(b); | 147 | BIO_clear_retry_flags(b); |
| 145 | if (ret <= 0) | 148 | if (ret <= 0) { |
| 146 | { | ||
| 147 | if (BIO_sock_should_retry(ret)) | 149 | if (BIO_sock_should_retry(ret)) |
| 148 | BIO_set_retry_read(b); | 150 | BIO_set_retry_read(b); |
| 149 | } | ||
| 150 | } | 151 | } |
| 151 | return(ret); | ||
| 152 | } | 152 | } |
| 153 | return (ret); | ||
| 154 | } | ||
| 153 | 155 | ||
| 154 | static int sock_write(BIO *b, const char *in, int inl) | 156 | static int |
| 155 | { | 157 | sock_write(BIO *b, const char *in, int inl) |
| 158 | { | ||
| 156 | int ret; | 159 | int ret; |
| 157 | 160 | ||
| 158 | errno = 0; | 161 | errno = 0; |
| 159 | ret=write(b->num,in,inl); | 162 | ret = write(b->num, in, inl); |
| 160 | BIO_clear_retry_flags(b); | 163 | BIO_clear_retry_flags(b); |
| 161 | if (ret <= 0) | 164 | if (ret <= 0) { |
| 162 | { | ||
| 163 | if (BIO_sock_should_retry(ret)) | 165 | if (BIO_sock_should_retry(ret)) |
| 164 | BIO_set_retry_write(b); | 166 | BIO_set_retry_write(b); |
| 165 | } | ||
| 166 | return(ret); | ||
| 167 | } | 167 | } |
| 168 | return (ret); | ||
| 169 | } | ||
| 168 | 170 | ||
| 169 | static long sock_ctrl(BIO *b, int cmd, long num, void *ptr) | 171 | static long |
| 170 | { | 172 | sock_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 171 | long ret=1; | 173 | { |
| 174 | long ret = 1; | ||
| 172 | int *ip; | 175 | int *ip; |
| 173 | 176 | ||
| 174 | switch (cmd) | 177 | switch (cmd) { |
| 175 | { | ||
| 176 | case BIO_C_SET_FD: | 178 | case BIO_C_SET_FD: |
| 177 | sock_free(b); | 179 | sock_free(b); |
| 178 | b->num= *((int *)ptr); | 180 | b->num= *((int *)ptr); |
| 179 | b->shutdown=(int)num; | 181 | b->shutdown = (int)num; |
| 180 | b->init=1; | 182 | b->init = 1; |
| 181 | break; | 183 | break; |
| 182 | case BIO_C_GET_FD: | 184 | case BIO_C_GET_FD: |
| 183 | if (b->init) | 185 | if (b->init) { |
| 184 | { | 186 | ip = (int *)ptr; |
| 185 | ip=(int *)ptr; | 187 | if (ip != NULL) |
| 186 | if (ip != NULL) *ip=b->num; | 188 | *ip = b->num; |
| 187 | ret=b->num; | 189 | ret = b->num; |
| 188 | } | 190 | } else |
| 189 | else | 191 | ret = -1; |
| 190 | ret= -1; | ||
| 191 | break; | 192 | break; |
| 192 | case BIO_CTRL_GET_CLOSE: | 193 | case BIO_CTRL_GET_CLOSE: |
| 193 | ret=b->shutdown; | 194 | ret = b->shutdown; |
| 194 | break; | 195 | break; |
| 195 | case BIO_CTRL_SET_CLOSE: | 196 | case BIO_CTRL_SET_CLOSE: |
| 196 | b->shutdown=(int)num; | 197 | b->shutdown = (int)num; |
| 197 | break; | 198 | break; |
| 198 | case BIO_CTRL_DUP: | 199 | case BIO_CTRL_DUP: |
| 199 | case BIO_CTRL_FLUSH: | 200 | case BIO_CTRL_FLUSH: |
| 200 | ret=1; | 201 | ret = 1; |
| 201 | break; | 202 | break; |
| 202 | default: | 203 | default: |
| 203 | ret=0; | 204 | ret = 0; |
| 204 | break; | 205 | break; |
| 205 | } | ||
| 206 | return(ret); | ||
| 207 | } | 206 | } |
| 207 | return (ret); | ||
| 208 | } | ||
| 208 | 209 | ||
| 209 | static int sock_puts(BIO *bp, const char *str) | 210 | static int |
| 210 | { | 211 | sock_puts(BIO *bp, const char *str) |
| 211 | int n,ret; | 212 | { |
| 213 | int n, ret; | ||
| 212 | 214 | ||
| 213 | n=strlen(str); | 215 | n = strlen(str); |
| 214 | ret=sock_write(bp,str,n); | 216 | ret = sock_write(bp, str, n); |
| 215 | return(ret); | 217 | return (ret); |
| 216 | } | 218 | } |
| 217 | 219 | ||
| 218 | int BIO_sock_should_retry(int i) | 220 | int |
| 219 | { | 221 | BIO_sock_should_retry(int i) |
| 222 | { | ||
| 220 | int err; | 223 | int err; |
| 221 | 224 | ||
| 222 | if ((i == 0) || (i == -1)) | 225 | if ((i == 0) || (i == -1)) { |
| 223 | { | 226 | err = errno; |
| 224 | err=errno; | ||
| 225 | 227 | ||
| 226 | #if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ | 228 | #if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ |
| 227 | if ((i == -1) && (err == 0)) | 229 | if ((i == -1) && (err == 0)) |
| 228 | return(1); | 230 | return (1); |
| 229 | #endif | 231 | #endif |
| 230 | 232 | ||
| 231 | return(BIO_sock_non_fatal_error(err)); | 233 | return (BIO_sock_non_fatal_error(err)); |
| 232 | } | ||
| 233 | return(0); | ||
| 234 | } | 234 | } |
| 235 | return (0); | ||
| 236 | } | ||
| 235 | 237 | ||
| 236 | int BIO_sock_non_fatal_error(int err) | 238 | int |
| 237 | { | 239 | BIO_sock_non_fatal_error(int err) |
| 238 | switch (err) | 240 | { |
| 239 | { | 241 | switch (err) { |
| 240 | #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_NETWARE) | 242 | #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_NETWARE) |
| 241 | # if defined(WSAEWOULDBLOCK) | 243 | # if defined(WSAEWOULDBLOCK) |
| 242 | case WSAEWOULDBLOCK: | 244 | case WSAEWOULDBLOCK: |
| @@ -284,12 +286,12 @@ int BIO_sock_non_fatal_error(int err) | |||
| 284 | #ifdef EALREADY | 286 | #ifdef EALREADY |
| 285 | case EALREADY: | 287 | case EALREADY: |
| 286 | #endif | 288 | #endif |
| 287 | return(1); | 289 | return (1); |
| 288 | /* break; */ | 290 | /* break; */ |
| 289 | default: | 291 | default: |
| 290 | break; | 292 | break; |
| 291 | } | ||
| 292 | return(0); | ||
| 293 | } | 293 | } |
| 294 | return (0); | ||
| 295 | } | ||
| 294 | 296 | ||
| 295 | #endif /* #ifndef OPENSSL_NO_SOCK */ | 297 | #endif /* #ifndef OPENSSL_NO_SOCK */ |
