Imported Upstream version 1.17
[platform/upstream/krb5.git] / src / lib / krb5 / os / read_msg.c
1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /* lib/krb5/os/read_msg.c */
3 /*
4  * Copyright 1991 by the Massachusetts Institute of Technology.
5  * All Rights Reserved.
6  *
7  * Export of this software from the United States of America may
8  *   require a specific license from the United States Government.
9  *   It is the responsibility of any person or organization contemplating
10  *   export to obtain such a license before exporting.
11  *
12  * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
13  * distribute this software and its documentation for any purpose and
14  * without fee is hereby granted, provided that the above copyright
15  * notice appear in all copies and that both that copyright notice and
16  * this permission notice appear in supporting documentation, and that
17  * the name of M.I.T. not be used in advertising or publicity pertaining
18  * to distribution of the software without specific, written prior
19  * permission.  Furthermore if you modify this software you must label
20  * your software as modified software and not distribute it in such a
21  * fashion that it might be confused with the original M.I.T. software.
22  * M.I.T. makes no representations about the suitability of
23  * this software for any purpose.  It is provided "as is" without express
24  * or implied warranty.
25  */
26
27 #include "k5-int.h"
28 #include <errno.h>
29
30 krb5_error_code
31 krb5_read_message(krb5_context context, krb5_pointer fdp, krb5_data *inbuf)
32 {
33     krb5_int32      len;
34     int             len2, ilen;
35     char            *buf = NULL;
36     int             fd = *( (int *) fdp);
37
38     *inbuf = empty_data();
39
40     if ((len2 = krb5_net_read(context, fd, (char *)&len, 4)) != 4)
41         return((len2 < 0) ? errno : ECONNABORTED);
42     len = ntohl(len);
43
44     if ((len & VALID_UINT_BITS) != (krb5_ui_4) len)  /* Overflow size_t??? */
45         return ENOMEM;
46
47     ilen = (int)len;
48     if (ilen) {
49         /*
50          * We may want to include a sanity check here someday....
51          */
52         if (!(buf = malloc(ilen))) {
53             return(ENOMEM);
54         }
55         if ((len2 = krb5_net_read(context, fd, buf, ilen)) != ilen) {
56             free(buf);
57             return((len2 < 0) ? errno : ECONNABORTED);
58         }
59     }
60     *inbuf = make_data(buf, ilen);
61     return(0);
62 }