From 1d028880cfb17a7c8a9e3b1f54cf1e980baca63d Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Mon, 10 Jun 2019 23:34:45 +0200 Subject: [PATCH] nsscash: add alignBufferTo() helper --- group.go | 12 ++---------- misc.go | 37 +++++++++++++++++++++++++++++++++++++ passwd.go | 7 +------ 3 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 misc.go diff --git a/group.go b/group.go index b7f7d1b..4513758 100644 --- a/group.go +++ b/group.go @@ -114,10 +114,7 @@ func SerializeGroup(g Group) []byte { offPasswd := uint16(data.Len()) data.Write([]byte(g.Passwd)) data.WriteByte(0) - // Padding to align the following uint16 - if data.Len()%2 != 0 { - data.WriteByte(0) - } + alignBufferTo(&data, 2) // align the following uint16 offMemOff := uint16(data.Len()) // Offsets for group members offMem := offMemOff + 2*uint16(len(mems_off)) @@ -154,12 +151,7 @@ func SerializeGroup(g Group) []byte { res.Write(data.Bytes()) // We must pad each entry so that all uint64 at the beginning of the // struct are 8 byte aligned - l := res.Len() - if l%8 != 0 { - for i := 0; i < 8-l%8; i++ { - res.WriteByte(0) - } - } + alignBufferTo(&res, 8) return res.Bytes() } diff --git a/misc.go b/misc.go new file mode 100644 index 0000000..2e60507 --- /dev/null +++ b/misc.go @@ -0,0 +1,37 @@ +// Miscellaneous functions + +// Copyright (C) 2019 Simon Ruderich +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package main + +import ( + "bytes" + "fmt" +) + +func alignBufferTo(b *bytes.Buffer, align int) { + if align <= 0 { + panic(fmt.Sprintf("invalid alignment %v", align)) + } + + l := b.Len() + if l%align == 0 { + return + } + for i := 0; i < align-l%align; i++ { + b.WriteByte(0) + } +} diff --git a/passwd.go b/passwd.go index 9035190..90fed68 100644 --- a/passwd.go +++ b/passwd.go @@ -134,12 +134,7 @@ func SerializePasswd(p Passwd) []byte { res.Write(data.Bytes()) // We must pad each entry so that all uint64 at the beginning of the // struct are 8 byte aligned - l := res.Len() - if l%8 != 0 { - for i := 0; i < 8-l%8; i++ { - res.WriteByte(0) - } - } + alignBufferTo(&res, 8) return res.Bytes() } -- 2.43.2