@@ -118,6 +118,16 @@ static struct afd {
118118#define ENI_FAMILY 5
119119#define ENI_SALEN 6
120120
121+ static ssize_t
122+ strappend (char * dest , const char * src , size_t size )
123+ {
124+ size_t len = strlen (src );
125+ if (len + 1 > size || len >= SSIZE_MAX - 1 )
126+ return (ssize_t )-1 ;
127+ memcpy (dest , src , len + 1 );
128+ return (ssize_t )(len + 1 );
129+ }
130+
121131int
122132getnameinfo (const struct sockaddr * sa , socklen_t salen , char * host , socklen_t hostlen , char * serv , socklen_t servlen , int flags )
123133{
@@ -158,16 +168,14 @@ getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, socklen_t ho
158168 /* what we should do? */
159169 } else if (flags & NI_NUMERICSERV ) {
160170 snprintf (numserv , sizeof (numserv ), "%d" , ntohs (port ));
161- if (strlen ( numserv ) + 1 > servlen )
171+ if (strappend ( serv , numserv , servlen ) < 0 )
162172 return ENI_MEMORY ;
163- strcpy (serv , numserv );
164173 } else {
165174#if defined(HAVE_GETSERVBYPORT )
166175 struct servent * sp = getservbyport (port , (flags & NI_DGRAM ) ? "udp" : "tcp" );
167176 if (sp ) {
168- if (strlen ( sp -> s_name ) + 1 > servlen )
177+ if (strappend ( serv , sp -> s_name , servlen ) < 0 )
169178 return ENI_MEMORY ;
170- strcpy (serv , sp -> s_name );
171179 } else
172180 return ENI_NOSERVNAME ;
173181#else
@@ -202,9 +210,8 @@ getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, socklen_t ho
202210 if (inet_ntop (afd -> a_af , addr , numaddr , sizeof (numaddr ))
203211 == NULL )
204212 return ENI_SYSTEM ;
205- if (strlen ( numaddr ) > hostlen )
213+ if (strappend ( host , numaddr , hostlen ) < 0 )
206214 return ENI_MEMORY ;
207- strcpy (host , numaddr );
208215 } else {
209216#ifdef INET6
210217 hp = getipnodebyaddr (addr , afd -> a_addrlen , afd -> a_af , & h_error );
@@ -218,13 +225,12 @@ getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, socklen_t ho
218225 p = strchr (hp -> h_name , '.' );
219226 if (p ) * p = '\0' ;
220227 }
221- if (strlen ( hp -> h_name ) + 1 > hostlen ) {
228+ if (strappend ( host , hp -> h_name , hostlen ) < 0 ) {
222229#ifdef INET6
223230 freehostent (hp );
224231#endif
225232 return ENI_MEMORY ;
226233 }
227- strcpy (host , hp -> h_name );
228234#ifdef INET6
229235 freehostent (hp );
230236#endif
@@ -234,9 +240,8 @@ getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, socklen_t ho
234240 if (inet_ntop (afd -> a_af , addr , numaddr , sizeof (numaddr ))
235241 == NULL )
236242 return ENI_NOHOSTNAME ;
237- if (strlen ( numaddr ) > hostlen )
243+ if (strappend ( host , numaddr , hostlen ) < 0 )
238244 return ENI_MEMORY ;
239- strcpy (host , numaddr );
240245 }
241246 }
242247 return SUCCESS ;
0 commit comments