summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2022-07-22 00:54:44 +0700
committerShulhan <ms@kilabit.info>2022-07-22 00:54:44 +0700
commit1c3fd0bc210a8587afc7c6a8f8a2f1edf3dd7e91 (patch)
tree1e949dabc34602c85f58e65b5fccbb2b0b5f6743
parent964ec77ee6bd2099a48bdd72c51739a264183538 (diff)
downloadpakakeh.go-1c3fd0bc210a8587afc7c6a8f8a2f1edf3dd7e91.tar.xz
lib/ini: fix marshaling pointer to nil field
If the field is pointer, the code will thrown panic if its point to nil struct or print "<invalid reflct.Value>" for String.
-rw-r--r--lib/ini/ini.go26
1 files changed, 16 insertions, 10 deletions
diff --git a/lib/ini/ini.go b/lib/ini/ini.go
index 6ce9b738..f66d47e9 100644
--- a/lib/ini/ini.go
+++ b/lib/ini/ini.go
@@ -176,7 +176,9 @@ func (in *Ini) marshalStruct(
switch kind {
case reflect.String:
- in.Set(sec, sub, key, fvalue.String())
+ if fvalue.IsValid() {
+ in.Set(sec, sub, key, fvalue.String())
+ }
case reflect.Array, reflect.Slice:
for xx := 0; xx < fvalue.Len(); xx++ {
@@ -252,22 +254,26 @@ func (in *Ini) marshalStruct(
}
case reflect.Struct:
- vi := fvalue.Interface()
- t, ok := vi.(time.Time)
- if ok {
- value = t.Format(layout)
- in.Set(sec, sub, key, value)
- continue
+ if fvalue.IsValid() {
+ vi := fvalue.Interface()
+ t, ok := vi.(time.Time)
+ if ok {
+ value = t.Format(layout)
+ in.Set(sec, sub, key, value)
+ continue
+ }
+ in.marshalStruct(reflect.TypeOf(vi), reflect.ValueOf(vi), sec, sub)
}
- in.marshalStruct(reflect.TypeOf(vi), reflect.ValueOf(vi), sec, sub)
case reflect.Invalid, reflect.Chan, reflect.Func,
reflect.UnsafePointer, reflect.Interface:
// Do nothing.
default:
- value = fmt.Sprintf("%v", fvalue)
- in.Set(sec, sub, key, value)
+ if fvalue.IsValid() {
+ value = fmt.Sprintf("%v", fvalue)
+ in.Set(sec, sub, key, value)
+ }
}
}
}