SCCS-vsn: sys/net/rtsock.c 7.5
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * @(#)rtsock.c 7.4 (Berkeley) %G%
+ * @(#)rtsock.c 7.5 (Berkeley) %G%
*/
#ifndef RTF_UP
#include "param.h"
#include "mbuf.h"
*/
#ifndef RTF_UP
#include "param.h"
#include "mbuf.h"
#include "user.h"
#include "proc.h"
#include "socket.h"
#include "user.h"
#include "proc.h"
#include "socket.h"
{
register struct rt_msghdr *rtm = 0;
register struct rtentry *rt = 0;
{
register struct rt_msghdr *rtm = 0;
register struct rtentry *rt = 0;
struct rtentry *saved_nrt;
struct sockaddr *dst = 0, *gate = 0, *netmask = 0, *author;
struct rt_metrics *rmm = 0;
struct rtentry *saved_nrt;
struct sockaddr *dst = 0, *gate = 0, *netmask = 0, *author;
struct rt_metrics *rmm = 0;
int len, error = 0;
#define FLUSH(e) { error = e; goto flush;}
int len, error = 0;
#define FLUSH(e) { error = e; goto flush;}
- if (m == 0 || (m = m_pullup(m, sizeof(long))) == 0)
- FLUSH(ENOBUFS);
+ if (m == 0)
+ return (ENOBUFS);
+ if (m->m_len < sizeof(long))
+ if ((m = m_pullup(m, sizeof(long))) == 0)
+ return (ENOBUFS);
if ((m->m_flags & M_PKTHDR) == 0)
if ((m->m_flags & M_PKTHDR) == 0)
len = m->m_pkthdr.len;
rtm = mtod(m, struct rt_msghdr *);
if (len < rtm->rtm_msglen)
len = m->m_pkthdr.len;
rtm = mtod(m, struct rt_msghdr *);
if (len < rtm->rtm_msglen)
cleanup:
if (rt)
rtfree(rt);
cleanup:
if (rt)
rtfree(rt);
- cp = (caddr_t)rtm;
- m_copyback(m = m0, 0, len, cp);
- /*if (m->m_pkthdr.len != len) {
- m_freem(m);
- return (error);
- } */
+ if (cp = (caddr_t)rtm) {
+ m_copyback(m, 0, len, cp);
+ Free(rtm);
+ }
route_proto.sp_protocol = dst->sa_family;
route_proto.sp_protocol = dst->sa_family;
- raw_input(m0, &route_proto, &route_src, &route_dst);
+ raw_input(m, &route_proto, &route_src, &route_dst);