Skip to content

Commit 0646a92

Browse files
committed
fix: do not leave uninitialized bytes in datatype input function
Signed-off-by: usamoi <[email protected]>
1 parent 360ff16 commit 0646a92

File tree

6 files changed

+17
-94
lines changed

6 files changed

+17
-94
lines changed

src/datatype/casts_f32.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ fn vecf32_cast_array_to_vector(
1313
assert!(!array.contains_nulls());
1414
let typmod = Typmod::parse_from_i32(typmod).unwrap();
1515
let len = typmod.dims().unwrap_or(array.len() as u16);
16-
let mut data = Vecf32::new_zeroed_in_postgres(len as usize);
16+
let mut data = vec![F32::zero(); len as usize];
1717
for (i, x) in array.iter().enumerate() {
1818
data[i] = F32(x.unwrap_or(f32::NAN));
1919
}
20-
data
20+
Vecf32::new_in_postgres(&data)
2121
}
2222

2323
#[pgrx::pg_extern(immutable, parallel_safe, strict)]

src/datatype/operators_f16.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ fn vecf16_operator_add(lhs: Vecf16Input<'_>, rhs: Vecf16Input<'_>) -> Vecf16Outp
1414
.friendly();
1515
}
1616
let n = lhs.len();
17-
let mut v = Vecf16::new_zeroed(n);
17+
let mut v = vec![F16::zero(); n];
1818
for i in 0..n {
1919
v[i] = lhs[i] + rhs[i];
2020
}
21-
v.copy_into_postgres()
21+
Vecf16::new_in_postgres(&v)
2222
}
2323

2424
#[pgrx::pg_operator(immutable, parallel_safe, requires = ["vecf16"])]
@@ -32,11 +32,11 @@ fn vecf16_operator_minus(lhs: Vecf16Input<'_>, rhs: Vecf16Input<'_>) -> Vecf16Ou
3232
.friendly();
3333
}
3434
let n = lhs.len();
35-
let mut v = Vecf16::new_zeroed(n);
35+
let mut v = vec![F16::zero(); n];
3636
for i in 0..n {
3737
v[i] = lhs[i] - rhs[i];
3838
}
39-
v.copy_into_postgres()
39+
Vecf16::new_in_postgres(&v)
4040
}
4141

4242
#[pgrx::pg_operator(immutable, parallel_safe, requires = ["vecf16"])]

src/datatype/operators_f32.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ fn vecf32_operator_add(lhs: Vecf32Input<'_>, rhs: Vecf32Input<'_>) -> Vecf32Outp
1414
.friendly();
1515
}
1616
let n = lhs.len();
17-
let mut v = Vecf32::new_zeroed(n);
17+
let mut v = vec![F32::zero(); n];
1818
for i in 0..n {
1919
v[i] = lhs[i] + rhs[i];
2020
}
21-
v.copy_into_postgres()
21+
Vecf32::new_in_postgres(&v)
2222
}
2323

2424
#[pgrx::pg_operator(immutable, parallel_safe, requires = ["vecf32"])]
@@ -32,11 +32,11 @@ fn vecf32_operator_minus(lhs: Vecf32Input<'_>, rhs: Vecf32Input<'_>) -> Vecf32Ou
3232
.friendly();
3333
}
3434
let n = lhs.len();
35-
let mut v = Vecf32::new_zeroed(n);
35+
let mut v = vec![F32::zero(); n];
3636
for i in 0..n {
3737
v[i] = lhs[i] - rhs[i];
3838
}
39-
v.copy_into_postgres()
39+
Vecf32::new_in_postgres(&v)
4040
}
4141

4242
#[pgrx::pg_operator(immutable, parallel_safe, requires = ["vecf32"])]

src/datatype/vecf16.rs

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ CREATE TYPE vecf16 (
4040
pub struct Vecf16 {
4141
varlena: u32,
4242
kind: u8,
43+
pad: u8,
4344
len: u16,
4445
phantom: [F16; 0],
4546
}
@@ -55,53 +56,20 @@ impl Vecf16 {
5556
let layout = layout_alpha.extend(layout_beta).unwrap().0;
5657
layout.pad_to_align()
5758
}
58-
pub fn new(slice: &[F16]) -> Box<Self> {
59-
unsafe {
60-
assert!(u16::try_from(slice.len()).is_ok());
61-
let layout = Vecf16::layout(slice.len());
62-
let ptr = std::alloc::alloc(layout) as *mut Vecf16;
63-
std::ptr::addr_of_mut!((*ptr).varlena).write(Vecf16::varlena(layout.size()));
64-
std::ptr::addr_of_mut!((*ptr).kind).write(16);
65-
std::ptr::addr_of_mut!((*ptr).len).write(slice.len() as u16);
66-
std::ptr::copy_nonoverlapping(slice.as_ptr(), (*ptr).phantom.as_mut_ptr(), slice.len());
67-
Box::from_raw(ptr)
68-
}
69-
}
7059
pub fn new_in_postgres(slice: &[F16]) -> Vecf16Output {
7160
unsafe {
7261
assert!(u16::try_from(slice.len()).is_ok());
7362
let layout = Vecf16::layout(slice.len());
7463
let ptr = pgrx::pg_sys::palloc(layout.size()) as *mut Vecf16;
64+
ptr.cast::<u8>().add(layout.size() - 8).write_bytes(0, 8);
7565
std::ptr::addr_of_mut!((*ptr).varlena).write(Vecf16::varlena(layout.size()));
7666
std::ptr::addr_of_mut!((*ptr).kind).write(16);
67+
std::ptr::addr_of_mut!((*ptr).pad).write(0);
7768
std::ptr::addr_of_mut!((*ptr).len).write(slice.len() as u16);
7869
std::ptr::copy_nonoverlapping(slice.as_ptr(), (*ptr).phantom.as_mut_ptr(), slice.len());
7970
Vecf16Output(NonNull::new(ptr).unwrap())
8071
}
8172
}
82-
pub fn new_zeroed(len: usize) -> Box<Self> {
83-
unsafe {
84-
assert!(u16::try_from(len).is_ok());
85-
let layout = Vecf16::layout(len);
86-
let ptr = std::alloc::alloc_zeroed(layout) as *mut Vecf16;
87-
std::ptr::addr_of_mut!((*ptr).varlena).write(Vecf16::varlena(layout.size()));
88-
std::ptr::addr_of_mut!((*ptr).kind).write(16);
89-
std::ptr::addr_of_mut!((*ptr).len).write(len as u16);
90-
Box::from_raw(ptr)
91-
}
92-
}
93-
#[allow(dead_code)]
94-
pub fn new_zeroed_in_postgres(len: usize) -> Vecf16Output {
95-
unsafe {
96-
assert!(u64::try_from(len).is_ok());
97-
let layout = Vecf16::layout(len);
98-
let ptr = pgrx::pg_sys::palloc0(layout.size()) as *mut Vecf16;
99-
std::ptr::addr_of_mut!((*ptr).varlena).write(Vecf16::varlena(layout.size()));
100-
std::ptr::addr_of_mut!((*ptr).kind).write(16);
101-
std::ptr::addr_of_mut!((*ptr).len).write(len as u16);
102-
Vecf16Output(NonNull::new(ptr).unwrap())
103-
}
104-
}
10573
pub fn len(&self) -> usize {
10674
self.len as usize
10775
}
@@ -115,13 +83,6 @@ impl Vecf16 {
11583
debug_assert_eq!(self.kind, 16);
11684
unsafe { std::slice::from_raw_parts_mut(self.phantom.as_mut_ptr(), self.len as usize) }
11785
}
118-
#[allow(dead_code)]
119-
pub fn copy(&self) -> Box<Vecf16> {
120-
Vecf16::new(self.data())
121-
}
122-
pub fn copy_into_postgres(&self) -> Vecf16Output {
123-
Vecf16::new_in_postgres(self.data())
124-
}
12586
}
12687

12788
impl Deref for Vecf16 {

src/datatype/vecf32.rs

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ CREATE TYPE vector (
4040
pub struct Vecf32 {
4141
varlena: u32,
4242
kind: u8,
43+
pad: u8,
4344
len: u16,
4445
phantom: [F32; 0],
4546
}
@@ -55,53 +56,20 @@ impl Vecf32 {
5556
let layout = layout_alpha.extend(layout_beta).unwrap().0;
5657
layout.pad_to_align()
5758
}
58-
pub fn new(slice: &[F32]) -> Box<Self> {
59-
unsafe {
60-
assert!(u16::try_from(slice.len()).is_ok());
61-
let layout = Vecf32::layout(slice.len());
62-
let ptr = std::alloc::alloc(layout) as *mut Vecf32;
63-
std::ptr::addr_of_mut!((*ptr).varlena).write(Vecf32::varlena(layout.size()));
64-
std::ptr::addr_of_mut!((*ptr).kind).write(32);
65-
std::ptr::addr_of_mut!((*ptr).len).write(slice.len() as u16);
66-
std::ptr::copy_nonoverlapping(slice.as_ptr(), (*ptr).phantom.as_mut_ptr(), slice.len());
67-
Box::from_raw(ptr)
68-
}
69-
}
7059
pub fn new_in_postgres(slice: &[F32]) -> Vecf32Output {
7160
unsafe {
7261
assert!(u16::try_from(slice.len()).is_ok());
7362
let layout = Vecf32::layout(slice.len());
7463
let ptr = pgrx::pg_sys::palloc(layout.size()) as *mut Vecf32;
64+
ptr.cast::<u8>().add(layout.size() - 8).write_bytes(0, 8);
7565
std::ptr::addr_of_mut!((*ptr).varlena).write(Vecf32::varlena(layout.size()));
7666
std::ptr::addr_of_mut!((*ptr).kind).write(32);
67+
std::ptr::addr_of_mut!((*ptr).pad).write(0);
7768
std::ptr::addr_of_mut!((*ptr).len).write(slice.len() as u16);
7869
std::ptr::copy_nonoverlapping(slice.as_ptr(), (*ptr).phantom.as_mut_ptr(), slice.len());
7970
Vecf32Output(NonNull::new(ptr).unwrap())
8071
}
8172
}
82-
pub fn new_zeroed(len: usize) -> Box<Self> {
83-
unsafe {
84-
assert!(u16::try_from(len).is_ok());
85-
let layout = Vecf32::layout(len);
86-
let ptr = std::alloc::alloc_zeroed(layout) as *mut Vecf32;
87-
std::ptr::addr_of_mut!((*ptr).varlena).write(Vecf32::varlena(layout.size()));
88-
std::ptr::addr_of_mut!((*ptr).kind).write(32);
89-
std::ptr::addr_of_mut!((*ptr).len).write(len as u16);
90-
Box::from_raw(ptr)
91-
}
92-
}
93-
#[allow(dead_code)]
94-
pub fn new_zeroed_in_postgres(len: usize) -> Vecf32Output {
95-
unsafe {
96-
assert!(u64::try_from(len).is_ok());
97-
let layout = Vecf32::layout(len);
98-
let ptr = pgrx::pg_sys::palloc0(layout.size()) as *mut Vecf32;
99-
std::ptr::addr_of_mut!((*ptr).varlena).write(Vecf32::varlena(layout.size()));
100-
std::ptr::addr_of_mut!((*ptr).kind).write(32);
101-
std::ptr::addr_of_mut!((*ptr).len).write(len as u16);
102-
Vecf32Output(NonNull::new(ptr).unwrap())
103-
}
104-
}
10573
pub fn len(&self) -> usize {
10674
self.len as usize
10775
}
@@ -115,13 +83,6 @@ impl Vecf32 {
11583
debug_assert_eq!(self.kind, 32);
11684
unsafe { std::slice::from_raw_parts_mut(self.phantom.as_mut_ptr(), self.len as usize) }
11785
}
118-
#[allow(dead_code)]
119-
pub fn copy(&self) -> Box<Vecf32> {
120-
Vecf32::new(self.data())
121-
}
122-
pub fn copy_into_postgres(&self) -> Vecf32Output {
123-
Vecf32::new_in_postgres(self.data())
124-
}
12586
}
12687

12788
impl Deref for Vecf32 {

src/index/utils.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use service::prelude::DynamicVector;
66
struct Header {
77
varlena: u32,
88
kind: u8,
9+
pad: u8,
910
len: u16,
1011
}
1112

0 commit comments

Comments
 (0)