Explorar o código

Revert 'fix netdb on names with spaces', just ignore invalid lines

jD91mZM2 %!s(int64=6) %!d(string=hai) anos
pai
achega
882b86e282
Modificáronse 1 ficheiros con 63 adicións e 51 borrados
  1. 63 51
      src/header/netdb/mod.rs

+ 63 - 51
src/header/netdb/mod.rs

@@ -850,8 +850,9 @@ pub unsafe extern "C" fn getservent() -> *const servent {
     rlb.seek(S_POS);
 
     let mut r: Box<str> = Box::default();
-    while r.is_empty() || r.split_whitespace().next() == None || r.starts_with("#") {
-        r = match rlb.next() {
+
+    loop {
+        let mut r = match rlb.next() {
             Line::Some(s) => bytes_to_box_str(s),
             _ => {
                 if SERV_STAYOPEN == 0 {
@@ -860,58 +861,69 @@ pub unsafe extern "C" fn getservent() -> *const servent {
                 return ptr::null();
             }
         };
-    }
 
-    rlb.next();
-    S_POS = rlb.line_pos();
-
-    let comment = r.find('#').unwrap_or(r.len());
-    let space = r[..comment].trim_right().rfind(char::is_whitespace).unwrap();
-    let mut serv_name = r[..space].trim().as_bytes().to_vec();
-    serv_name.push(b'\0');
-    let port_proto = &r[space..comment].trim();
-    let mut split = port_proto.split("/");
-    let mut port = split.next().unwrap().as_bytes().to_vec();
-    port.push(b'\0');
-    SERV_PORT = Some(htons(atoi(port.as_mut_slice().as_mut_ptr() as *mut i8) as u16) as u32 as i32);
-    let mut proto = split.next().unwrap().as_bytes().to_vec();
-    proto.push(b'\0');
-
-    /*
-     *let mut _serv_aliases: Vec<Vec<u8>> = Vec::new();
-     *loop {
-     *    let mut alias = match iter.next() {
-     *        Some(s) => s.as_bytes().to_vec(),
-     *        _ => break
-     *    };
-     *    alias.push(b'\0');
-     *    _serv_aliases.push(alias);
-     *}
-     *let mut serv_aliases: Vec<*mut i8> = _serv_aliases.iter_mut().map(|x| x.as_mut_ptr() as *mut i8).collect();
-     *serv_aliases.push(ptr::null_mut());
-     *
-     */
-    let mut _serv_aliases: Vec<Vec<u8>> = Vec::new();
-    _serv_aliases.push(vec![b'\0']);
-    let mut serv_aliases: Vec<*mut i8> = Vec::new();
-    serv_aliases.push(ptr::null_mut());
-    serv_aliases.push(ptr::null_mut());
-
-    SERV_ALIASES = Some(_serv_aliases);
-    SERV_NAME = Some(serv_name);
-    SERV_PROTO = Some(proto);
-
-    SERV_ENTRY = servent {
-        s_name: SERV_NAME.as_mut().unwrap().as_mut_slice().as_mut_ptr() as *mut c_char,
-        s_aliases: serv_aliases.as_mut_slice().as_mut_ptr() as *mut *mut i8,
-        s_port: SERV_PORT.unwrap(),
-        s_proto: SERV_PROTO.as_mut().unwrap().as_mut_slice().as_mut_ptr() as *mut c_char,
-    };
+        let mut iter = r.split_whitespace();
+        let mut serv_name = match iter.next() {
+            Some(serv_name) => serv_name.as_bytes().to_vec(),
+            None => continue
+        };
+        serv_name.push(b'\0');
+        let port_proto = match iter.next() {
+            Some(port_proto) => port_proto,
+            None => continue
+        };
+        let mut split = port_proto.split("/");
+        let mut port = match split.next() {
+            Some(port) => port.as_bytes().to_vec(),
+            None => continue
+        };
+        port.push(b'\0');
+        SERV_PORT = Some(htons(atoi(port.as_mut_slice().as_mut_ptr() as *mut i8) as u16) as u32 as i32);
+        let mut proto = match split.next() {
+            Some(proto) => proto.as_bytes().to_vec(),
+            None => continue
+        };
+        proto.push(b'\0');
+
+        rlb.next();
+        S_POS = rlb.line_pos();
+
+        /*
+         *let mut _serv_aliases: Vec<Vec<u8>> = Vec::new();
+         *loop {
+         *    let mut alias = match iter.next() {
+         *        Some(s) => s.as_bytes().to_vec(),
+         *        _ => break
+         *    };
+         *    alias.push(b'\0');
+         *    _serv_aliases.push(alias);
+         *}
+         *let mut serv_aliases: Vec<*mut i8> = _serv_aliases.iter_mut().map(|x| x.as_mut_ptr() as *mut i8).collect();
+         *serv_aliases.push(ptr::null_mut());
+         *
+         */
+        let mut _serv_aliases: Vec<Vec<u8>> = Vec::new();
+        _serv_aliases.push(vec![b'\0']);
+        let mut serv_aliases: Vec<*mut i8> = Vec::new();
+        serv_aliases.push(ptr::null_mut());
+        serv_aliases.push(ptr::null_mut());
+
+        SERV_ALIASES = Some(_serv_aliases);
+        SERV_NAME = Some(serv_name);
+        SERV_PROTO = Some(proto);
+
+        SERV_ENTRY = servent {
+            s_name: SERV_NAME.as_mut().unwrap().as_mut_slice().as_mut_ptr() as *mut c_char,
+            s_aliases: serv_aliases.as_mut_slice().as_mut_ptr() as *mut *mut i8,
+            s_port: SERV_PORT.unwrap(),
+            s_proto: SERV_PROTO.as_mut().unwrap().as_mut_slice().as_mut_ptr() as *mut c_char,
+        };
 
-    if SERV_STAYOPEN == 0 {
-        endservent();
+        if SERV_STAYOPEN == 0 {
+            endservent();
+        }
+        break &SERV_ENTRY as *const servent
     }
-    &SERV_ENTRY as *const servent
 }
 
 #[no_mangle]