From 7566a1e399dfcf22603c5ed4276d8e749dd1085d Mon Sep 17 00:00:00 2001 From: Avi Vaid Date: Mon, 11 Jul 2016 19:45:37 -0400 Subject: [PATCH] implemented freeing memory in secretservice and made minor edits to osxkeychain Signed-off-by: Avi Vaid --- osxkeychain/osxkeychain_darwin.go | 20 +++++++++----------- secretservice/secretservice_linux.c | 8 ++++++++ secretservice/secretservice_linux.go | 2 ++ secretservice/secretservice_linux.h | 1 + 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/osxkeychain/osxkeychain_darwin.go b/osxkeychain/osxkeychain_darwin.go index 151f1a9..28c316d 100644 --- a/osxkeychain/osxkeychain_darwin.go +++ b/osxkeychain/osxkeychain_darwin.go @@ -10,11 +10,11 @@ package osxkeychain import "C" import ( "errors" + "github.com/docker/docker-credential-helpers/credentials" "net/url" "strconv" "strings" "unsafe" - "github.com/docker/docker-credential-helpers/credentials" ) // errCredentialsNotFound is the specific error message returned by OS X @@ -94,19 +94,19 @@ func (h Osxkeychain) Get(serverURL string) (string, string, error) { return user, pass, nil } -func (h Osxkeychain) List() ([]string, []string, error){ - var pathsC** C.char +func (h Osxkeychain) List() ([]string, []string, error) { + var pathsC **C.char defer C.free(unsafe.Pointer(pathsC)) - var acctsC** C.char + var acctsC **C.char defer C.free(unsafe.Pointer(acctsC)) var listLenC C.uint errMsg := C.keychain_list(&pathsC, &acctsC, &listLenC) - if errMsg!=nil { + if errMsg != nil { defer C.free(unsafe.Pointer(errMsg)) goMsg := C.GoString(errMsg) return nil, nil, errors.New(goMsg) } - var listLen int; + var listLen int listLen = int(listLenC) pathTmp := (*[1 << 30]*C.char)(unsafe.Pointer(pathsC))[:listLen:listLen] acctTmp := (*[1 << 30]*C.char)(unsafe.Pointer(acctsC))[:listLen:listLen] @@ -114,8 +114,8 @@ func (h Osxkeychain) List() ([]string, []string, error){ paths := make([]string, listLen) accts := make([]string, listLen) at := 0 - for i := 0; i < listLen ; i++ { - if C.GoString(pathTmp[i])=="0" { + for i := 0; i < listLen; i++ { + if C.GoString(pathTmp[i]) == "0" { continue } paths[at] = C.GoString(pathTmp[i]) @@ -124,9 +124,8 @@ func (h Osxkeychain) List() ([]string, []string, error){ } paths = paths[:at] accts = accts[:at] - //still need to free all the memory we allocated in the c file - //do it here >> C.freeListData(&pathsC, listLenC) + C.freeListData(&acctsC, listLenC) return paths, accts, nil } @@ -164,4 +163,3 @@ func freeServer(s *C.struct_Server) { C.free(unsafe.Pointer(s.host)) C.free(unsafe.Pointer(s.path)) } - diff --git a/secretservice/secretservice_linux.c b/secretservice/secretservice_linux.c index d713814..331faf9 100644 --- a/secretservice/secretservice_linux.c +++ b/secretservice/secretservice_linux.c @@ -1,4 +1,5 @@ #include +#include #include "secretservice_linux.h" const SecretSchema *docker_get_schema(void) @@ -137,3 +138,10 @@ GError *list(char *** paths, char *** accts, unsigned int *list_l) { *list_l = numKeys; return NULL; } + +void freeListData(char *** data, unsigned int length) { + for(int i=0; i